首页 > 代码库 > 赋值运算符函数的返回值类型详解

赋值运算符函数的返回值类型详解

在c++赋值运算符函数的学习中,对于返回值类型的问题,一直非常费解,今天彻底总结一些每种不同返回值类型的结果:

1、当返回值为空时:

<span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span>


这个时候如果只有一个‘=’(a = b)运算那就没问题,但是如果存在‘=’(a = b = c)的链式操作时,编译器就会报错

我们看:a = b = c;

程序会先运行 b = c;

因为函数的返回值为viod , 所以 b = c这个操作就会返回一个NULL

那么这是 a = (b = c) 也就是 a = NULL , 这种操作时不存在的 , 即使是存在也不符合我们对这个操作的初衷。


2、当返回值是 类本身时:

<span style="font-size:14px;">hasptr hasptr::operator=(const hasptr& s)</span>


支持‘=’的链式操作

如果返回值是类本身 , 那么这个函数运行的过程是:

                      1、进入函数内部,运行函数内部的操作

                      2、函数内部的操作运行完之后,调用类的拷贝构造函数,把对象拷贝给一个新的对象

                      3、返回那个新建立的对象


这里是关键是,每运行一次赋值运算符函数,就要调用一次拷贝构造函数,这样不仅会浪费时间。

如果类中没拷贝构造函数,有时候还会出错。


3、当返回值是引用时

<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)</span>


这种方式是最好的 , 即支持链式操作,还把操作时间降到了最低



完整代码:

<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)
{
    i = s.i;
    string *x = new string(*s.ps);
    delete ps;
    ps = x;
    return *this;
}</span>