奇怪的现行!请解释!
class A{public:
A(int* P=0):T(P){}
int get(){return *T;}
int* T;
};
A a(new int);
A b(int*PP=new int(100));
A c(new int(10));
int m=0;
//m=a.get();cout < <m < <endl;//异常!
// m=b.get();cout < <m < <endl;//错误!
m=c.get();cout < <m < <endl;//正确!
请解释!如上的现象!
[解决办法]
A a(new int); 没这样的用法
A b(int*PP=new int(100)); 动态分配的内存空间是不能分配给*PP的
[解决办法]
A b(int*PP=new int(100));//这是一个函数声明,不是一个类对象定义.
//m=b.get();cout < <m < <endl;//错误!这里的b没有定义,所以错误.
========================================================
更正:这里的b不是一个结构/类/联合,不能用一个函数指针调用成员函数.所以错误.
[解决办法]
我来证明给你看:
class A{
public:
A(int* P=0):T(P){}
int get(){return *T;}
int* T;
};
int main()
{
A b(int*PP=new int(100));//这是一个函数声明,不是一个类对象定义.
b();//没有上面一行,这里的b是错的,报b未定义错误.
return 0;
}
A b(int*PP)
{
cout < < "函数运行了 " < <endl;
return A();
}
[解决办法]
A a(new int);
m = a.get(); cout < < m < < endl;
这没什么问题,很正常,我的编译器没报什么问题,从语义上来说也没问题。
只是分配了一个没有初始化的空间而已。
[解决办法]
m=a.get();cout < <m < <endl;//异常
你没有给 A a(new int);初值,当然结果是奇怪的数据
A b(int*PP=new int(100));
我同意函数声明的说法
m=c.get();cout < <m < <endl
正常的,不用多说
另外,你这种 A c(new int(10));的使用方法,我不提倡你使用,都无法找到合适的位置delete申请的空间,造成内存泄露
[解决办法]
A c(new int(10));, 对类的构造函数来说,这种用法正常,析构函数就把它析构了.
[解决办法]
A c(new int(10));这种用法new int(10)属于类外
[解决办法]
1.堆上申请了空间.
2.运行完构造函数之后,成员指针T指向了刚才堆上申请的空间.
3.析构时,可以释放这个堆上申请的空间.
当然必须约定不能在构造时传一个不是堆上的空间的地址给它.
一个例子,stl的智能指针
auto_ptr <Type> pType(new Type);或写作
auto_ptr <Type> pType=new Type; 两者是一回事.