C++ 类的赋值运算符''=''重载的方法实现

2020-02-23 12:01:59于海丽

程序运行正常,内存图如下:

注意上边我用的operator=返回值是void, 这样不能进行连续赋值,比如: person a = b = c; ,若想连续赋值,返回值要声明为 引用

person& person::operator=(person const& e)
{
 if(age) delete age; 
 int data = *(e.age);
 age = new int(data);
 return *this;
}

关于拷贝函数

再回看一下上边的代码,我的声明语句和赋值语句是分开的 person b; b=a; ,如果声明时赋值 person b=a; ,那么调用的函数就不是 operator= 了,而是拷贝函数

class person{
 int* age;
public:
 person(person const& e); //这就是拷贝函数 
}

需要注意的是:上边说的operator返回值有两种情况:void和引用,其实还有第三种,既然能返回引用那就还能返回值:

person person::operator=(person const& e)
{
 if(age) delete age; 
 int data = *(e.age);
 age = new int(data);
 return *this;
}

函数返回值的时候会临时构造一个 person 变量, 这个变量的 age 的指向和调用 operator= 的对象的 age 指向一样,也就是:

operator= 调用完之后,临时变量会调用析构函数,从而导致和上边一样的错误,doublefree。所以 operator= 的返回值最好是引用!

到此这篇关于C++ 类的赋值运算符'='重载的方法实现的文章就介绍到这了,更多相关C++ 类的赋值运算符'='重载内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!