当类成员变量有指针类型的时候,要自定义拷贝函数,不要使用默认的拷贝构造函数.因为默认的拷贝构造构造函数是浅拷贝是位拷贝的,只拷贝指针指向的空间而没有把空间里的内容一起拷贝过来,这样会导致改变其中的一个,另一个也会跟着一起改变(老婆也都一样的了)class Teacher
{
public:
Teacher(); // 自定义的无参构造函数
Teacher(string n, double a, string ad, char* work); // 自定义的无参构造函数
Teacher(const Teacher & other); //声明拷贝构造函数 other可不写; 必须要const 和引用&
void eat();
void sleep();
void setname(); //设置人名
void getname() const;
void setwork(char* work);
private:
char work; //指针
Teacher::Teacher():name("abd"), age(36), adrr("湖南省长沙市") //自定义无参构造函数初始化变量
{
work = new char[WORK_LEN]; //分配内存空间
strcpy_s(this->work,WORK_LEN,"山江");
}
Teacher::Teacher(string n, double a, string ad, char work) : name(n), age(a), adrr(ad) //带参数的构造函数
{
work = new char[WORK_LEN]; //分配内存空间
if (work)
{strcpy_s(this->work, WORK_LEN, work);
}
else
{strcpy_s(this->work, WORK_LEN, "山江");
}
}
Teacher::Teacher(const Teacher& other):name(other.name),age(other.age),
adrr(other.adrr) //拷贝构造函数的实现
{
work = new char[WORK_LEN]; //重新分配空间关键()
strcpy_s(work, WORK_LEN, other.work); //other.work 形参
}
void Teacher::setwork(char * work) //设置工作
{
if (!work) //如果为空
{
return;
}
strcpy_s(this->work, WORK_LEN, work);
}
int main(void)
{
Teacher ls1; //定义了一个老师1 ,此时的直接调用你自定义无参构造函数初始化变量
Teacher ls4 (ls1); //这个时候会调用拷贝构造函数
cout << "没有做深拷贝ls1\n";
ls1.getname();
ls4.getname();cout << "做深拷贝ls1\n";
ls1.setwork((char*)"麻冲");
ls1.setname();
ls1.getname();
ls4.getname();
system("pause"); //控制台暂停
return 0;
}
ls1.setwork((char*)"麻冲"); 即使工作改了,ls2的工作也不会改变,因为已经做做了深拷贝处理