首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

奇怪的现行!请解释!解决思路

2012-03-06 
奇怪的现行!请解释!classA{public:A(int*P0):T(P){}intget(){return*T}int*T}Aa(newint)Ab(int*PPne

奇怪的现行!请解释!
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; 两者是一回事.

热点排行