读书人

看书时发现的一个指针有关问题C++类

发布时间: 2013-03-01 18:33:02 作者: rapoo

看书时发现的一个指针问题,C++类中的副本构造器


class MyClass {
public:
MyClass(int *ptr);
~MyClass();

MyClass(const MyClass &rhs);
MyClass &operator=(const MyClass &rhs);

private:
int *ptr;
};

MyClass::MyClass(int *ptr) {
// TODO Auto-generated constructor stub
cout<<"enter constructor"<<endl;
this->ptr = ptr;
cout<<"leaver constructor"<<endl;
}

MyClass::~MyClass() {
// TODO Auto-generated destructor stub
cout<<"enter destructor"<<endl;
delete ptr;
cout<<"leaver destructor"<<endl;
}

MyClass::MyClass(const MyClass &rhs){
cout<<"enter copyctor"<<endl;
*this = rhs;
cout<<"leave copyctor"<<endl;
}

MyClass &MyClass::operator =(const MyClass &rhs){
cout<<"enter operator="<<endl;

if(this!=&rhs){
delete ptr;

ptr = new int;
*ptr = *rhs.ptr;
}else{
cout<<"two obj is the same"<<endl;
}
cout<<"leave operator="<<endl;
return *this;
}


以下代码重载了操作符=,在副本构造器里面使用了重载后的操作符=
但是现在有一个很明显的问题,
如果这样使用

MyClass obj1(new int(1));
MyClass obj2 = obj1;

obj2根本不会进入构造函数去初始化私有指针ptr,这样ptr根本就没有被分配过内存,在重载操作符=的代码中,
判断this!=&rhs后,delete ptr直接就会报错
这是从书上考下来的代码,是我理解上有问题,还是这个程序有问题,往各位赐教,感激涕零! c++ 副本构造器
[解决办法]
复制构造函数应写成:
MyClass::MyClass(const MyClass &rhs):ptr(){
cout<<"enter copyctor"<<endl;
*this = rhs;
cout<<"leave copyctor"<<endl;
}

obj2进入了(复制)构造函数,但是此构造函数没有初始化ptr,是一个随机无意义的值,然后转入operator=,读取了这个随机无意义的值。

切记在可能的情况下,所有构造函数中一定要用成员列表对所有成员进成初始化。

另外,对于int型,先delete,然后new,属于吃饱了撑的。

这段代码完全是错的。

读书人网 >C++

热点推荐