类的对象如何赋值(c
导语:C++类对象赋值的异常设置,Linux C++第53讲
对象赋值的异常
学习了对象赋值的操作,我们知道对象的赋值,就是对象之间的成员变量一一对应赋值。如果对象成员变量有定义指针,那么,就容易出现内存异常。下面是一个程序测试代码,看看对象赋值导致的内存异常。
程序运行结果如下:
可以看到,定义了stud, stud1对象,执行stud1 = stud;操作,把stud对象赋值给stud1对象,然后,输出stud1对象的数据。却没有看到stud1正常的数据,为什么?
定义的student类有name, addr成员,该成员是一个指针变量。然后,在构造函数中给该指针申请内存,然后,拷贝数据。最后,销毁对象的时候,在类的析构函数中,释放申请到的内存块。
所以,问题就出在析构函数的“释放内存块”中。因为,执行 stud1 = stud;操作的时候,对象之间的成员变量相互赋值,有:
stud1.name = stud.name;
stud1.addr = stud.addr;
stud1.number = stud.number;
所以,stud1.name和stud.name指向同一块内存,stud1.addr和stud.addr指向同一块内存。那么,stud是在if语句块中定义的局部对象,当退出if语句块的时候,stud对象销毁,所以,调用stud对象的析构函数。
那么,在stud对象的析构函数中,释放了stud.name, stud.addr指针指向的内存块。
由于,stud1.name和stud.name的值相同,都是指向同一块内存地址。所以,stud.name指向的内存地址被释放之后,stud1.name指针的地址值也就无效。
所以,最后调用stud1.print()函数输出stud1对象的成员变量时,输出stud1.name, stud1.addr成员变量是空的数,因为,stud1.name, stud1.addr指针指向的内存块,已经被释放了。
那么,当对象的成员变量涉及到“指针”的时候,对象之间的赋值问题,应该怎么样操作,才可以安全赋值?
下面我们学习“赋值运算符重载”的操作,对指针类型的成员变量进行特殊操作,避免指针异常的问题。
本文内容由快快网络小馨创作整理编辑!