若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,可能会产生什么问题?
下面以示例说明
1、无拷贝复制构造函数
#include <iostream>
class MyClass
{
public:
MyClass(int a)
{
b=new int(a);
}
int *myGet()
{
return b;
}
protected:
private:
int *b;
};
int main()
{
MyClass class1(5);
MyClass class2(class1);
std::cout<<"class1.b="<<class1.myGet()<<" "<<"*b="<<*(class1.myGet())<<std::endl;
std::cout<<"class1.b="<<class2.myGet()<<" "<<"*b="<<*(class2.myGet())<<std::endl;
}
执行结果:
也就是两个对象的数据成员保存了同一个内存地址
2、有复制构造函数(深拷贝)
#include <iostream>
class MyClass
{
public:
MyClass(int a)
{
b=new int(a);
}
MyClass(const MyClass&class2)
{
b=new int(*(class2.b));
}
int *myGet()
{
return b;
}
protected:
private:
int *b;
};
int main()
{
MyClass class1(5);
MyClass class2(class1);
std::cout<<"class1.b="<<class1.myGet()<<" "<<"*b="<<*(class1.myGet())<<std::endl;
std::cout<<"class1.b="<<class2.myGet()<<" "<<"*b="<<*(class2.myGet())<<std::endl;
}
执行结果:
也就是两个对象的数据成员不一样,但保存的值都是5
答:缺省的拷贝构造函数都是浅构造,当对象含有指针数据成员,并用它初始化同类型的另一个对象时,缺省的拷贝构造函数只能将该对象的数据成员的值复制给另一个对象,而不能将该对象整个复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。