C++类对象的异常赋值

Posted LC编程开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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指针指向的内存块,已经被释放

了。

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

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

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

以上是关于C++类对象的异常赋值的主要内容,如果未能解决你的问题,请参考以下文章

实现数组类(C++ 拷贝构造函数拷贝函数)要判断赋值左右对象不相等,坑惨了

第3课 - 异常类构建

C++类对象的赋值操作

C++类对象的赋值操作

C++ 类和对象

C++ 类和对象