C++ 赋值构造函数的返回值到底有什么用?且返回值是否为引用类型有什么区别吗?

首先定义类Person函数

class Person{
public:
  string name;
  Person()=default; //默认构造函数
   Person(string nam):name(nam){} 
   void operator=(const Person& p){ //赋值构造函数
          this->name=p.name;
    }
};
Person a("xiaoming");
Person b;
cout<<b.name<<endl; //
b=a;//执行赋值构造函数
cout<<b.name<<endl; //xiaoming

 

由上,赋值操做已完成,可为何赋值构造函数还有个返回值this

为何有返回值?(初学者可能不理解b=a为何会产生返回值)

首先b并不接收返回值(b=a让某些初学者误认为b接受返回值)

其实只要把b=a 当作是 a.operator=(b)就能够了spa

b=a的返回值就至关于a.operator=(b)这个函数的返回值.net

好比code

咱们来修改赋值构造函数返回值为一个具体的整数100对象

int operator=(const Person& p) {
    this->name = p.name;
    return 100;
}

cout<<10+(b=a)<<endl; // 110

结果,(b=a)产生了一个临时变量100,而后这个临时变量和10相加得结果110,这个临时变量就是咱们所谓的返回值blog

 

那返回值到底有什么用呢?

可让对象进行链式操做内存

好比咱们将返回值更改成这个对象的引用get

Person& operator=(const Person& p) {
    this->name = p.name;
    return *this;
}

Person& showName() {
    cout<<this->name;
    return *this;
}

(b=a).showName(); //xiaoming

咱们在给b赋值之后还能再让其还能再执行函数showNamestring

那返回值是引用类型和非引用类型有区别吗?

区别固然大了

1.对一个对象进行两次连续的赋值操做

首先新建一个对象c

Person c("huanghuang");

1)赋值构造函数返回值是引用类型

(b=a)=c;
cout<<b.name<<endl; //huanghuang
 
 

2)赋值构造函数返回值不是引用类型

 
 
(b=a)=c;
cout<<b.name<<endl; //xiaoming

能够看到结果不一样,究其缘由,第2)种状况让系统拷贝了一份临时变量,于是是c给临时变量赋值,而非对象b

    表一    结果对比表                                                 

 

    返回值类型           (b=a)执行后产生的结果            

      Person&                       b的引用                           

       Person             b的一份拷贝(临时变量)         

扩展阅读:

临时变量又叫作右值,左值就是非临时变量

详细解释:( http://www.javashuo.com/article/p-dqyvolzx-gu.html  https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/  https://blog.csdn.net/zhangsj1007/article/details/79940370【三篇关于左值右值的讲解】)

粗糙解释:就是在执行某段代码中间产生的临时变量,这个临时变量在执行完这段代码后就会被析构,除非你引用了这个临时变量。

//若是返回值类型不为引用  产生了临时变量  咱们引用这个临时变量

Person&& d=b=a;

Person&用于引用一个已经被定义好的Person对象

Person&&则是用于引用一个临时的Person对象(认领这块无主之地)

2.将一个对象连续赋值给两个对象

即a=b=c

首先咱们增长一个拷贝构造函数 再给赋值构造函数增长一个输出

Person(const Person&p) { cout<<"copy constructor"<<endl; }
Person& operator=(const Person& p) {
    cout << "copy assignment constructor" << endl;
    this->name = p.name;
    return *this;
}

a=b=c;

1)赋值构造函数返回值为引用类型
copy assignment constructor
copy assignment constructor

2)赋值构造函数返回值为非引用类型
copy assignment constructor
copy constructor
copy assignment constructor
copy constructor

咱们看到赋值构造函数返回值为非引用类型时,致使系统为其拷贝生成两个临时变量

虽然最后达到的目的一致,可是增长了内存开支

 

综上,复制构造函数的返回值为引用类型比较好,在给多个对象赋值时,能够节省内存开支,在进行链式操做时,不但能够节省内存开支,还能够对其进行修改性操做

相关文章
相关标签/搜索