搜索
写经验 领红包

类的对象如何赋值(c

导语:C++类对象赋值的异常设置,Linux C++第53讲

类的对象如何赋值(c++给类赋值)

对象赋值的异常

学习了对象赋值的操作,我们知道对象的赋值,就是对象之间的成员变量一一对应赋值。如果对象成员变量有定义指针,那么,就容易出现内存异常。下面是一个程序测试代码,看看对象赋值导致的内存异常。

程序运行结果如下:

可以看到,定义了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指针指向的内存块,已经被释放了。

那么,当对象的成员变量涉及到“指针”的时候,对象之间的赋值问题,应该怎么样操作,才可以安全赋值?

下面我们学习“赋值运算符重载”的操作,对指针类型的成员变量进行特殊操作,避免指针异常的问题。

本文内容由快快网络小馨创作整理编辑!