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

由上,赋值操作已完成,可为什么赋值构造函数还有个返回值

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

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

其实只要把b=a 看成是 a.operator=(b)就可以了

b=a的返回值就相当于a.operator=(b)这个函数的返回值

比如

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

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

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

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

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

可以让对象进行链式操作

比如我们将返回值更改为这个对象的引用

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

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

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

我们在给b赋值以后还能再让其还能再执行函数showName

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

区别当然大了

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的一份拷贝(临时变量)

扩展阅读:

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

详细解释:( https://blog.csdn.net/thisinnocence/article/details/23883483  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 constructorcopy assignment constructor

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

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

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

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

原文地址:https://www.cnblogs.com/kiik/p/10708356.html

时间: 2024-12-11 17:45:50

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

C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?

之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导致栈溢出. 下面来看一个例子: class test { public: test() { cout << "constructor with argument\n"; } ~test() { } test(test& t) { cout << "

c++赋值构造函数为什么返回引用类型?

目录 0 前言 1 内置类型 2 自定义类型 3 结论 4 源码 0. 前言 c++默认赋值构造函数的返回值是引用类型,c++赋值运算符=的本意是返回左值的引用,我们重载赋值构造函数的时候,返回值是否应该设为引用类型呢? 按照<Effective C++>中第10条,最好是设为引用类型. 本文,通过实验来表述返回值是否为引用类型的区别. 1. 内置类型 int i= 1,     j=2,    k=3; case1: k = j = i i == 1 j == 1 k == 1 case2:

java.lang.Object.hashCode()的返回值到底是不是对象内存地址?

刚学Java的时候我也有过这种怀疑,但一直没有验证:最近在OSCHINA上看到有人在回答问题时也这么说,于是萌生了一探究竟的想法--java.lang.Object.hashCode()的返回值到底是不是对象内存地址? (顺带回顾一下JNI) hashCode契约 说到这个问题,大家的第一反应一定和我一样--去查Object.hashCode的源码,但翻开源码,看到的却是这样的(Oracle JDK 8): /** * Returns a hash code value for the obje

out.println(session.getLastAccessedTime());的返回值到底是毛线意思???

out.println(session.getLastAccessedTime());这个语句是输出最后一次成功获取session对象Attribute值的一个指令, 他的返回值是一个long型数据, 具体数值为1448334229658. 其实现在你们看到的这个long型数据是随时在变化的, 这个数字是时间在2015-11-24 11:04:02时的数据, 再详细点的解释就是2015-11-24 11:04:02距离1970-1-1 0:0:0的毫秒数. 为什么会是这个时间? 不止是这里, 包

c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void);//缺省的无参数构造函数 A(const A&a);//缺省的拷贝构造函数 -A();//缺省的析构函数 A&operator=(const A &a);//缺省的赋值构造函数 1).“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘

(copy)赋值构造函数的4种调用时机or方法

第一种调用方法: demo #include <iostream> using namespace std; class Text { public: Text() // 无参数构造函数 { m_a = 0; m_b = 0; cout << "无参数构造函数" << endl; } Text(int a) // 有参数构造函数 { m_a = a; m_b = 0; cout << "无参数构造函数" <<

构造函数的调用(其中不包括赋值构造函数)

1 #include<iostream> 2 3 using namespace std; 4 //解析和析构函数的调用 5 class Test 6 { 7 public: 8 Test() 9 { 10 cout<<"我是无参的构造函数\n\n"; 11 } 12 Test (int i) 13 { 14 t_a=i; 15 cout<<"i= "<<i<<endl; 16 cout<<&q

&lt;10&gt; 无参无返回值+ 无参有返回值函数的定义+有参无返回值函数定义+ 有参有返回值函数定义+函数的参数+函数的参数传递过程

无参无返回值: 1 #include <stdio.h> 2 3 4 /** 5 * 定义一个无参无返值函数 6 * 7 */ 8 void print_line(){ 9 10 printf("-----------------\n"); 11 12 } 13 14 15 16 int main(int argc, const char * argv[]) { 17 //调用函数 18 print_line(); 19 20 return 0; 21 } 无参有返回值函数

返回类型和return语句:无返回值函数,有返回值函数,返回数组指针

重点: 1.return语句功能:终止当前正在执行的函数并将控制权返回到调用该函数的地方.Return语句两种形式: Return: Return expression; 2.返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return. 3.Void函数如果想中间退出,可以使用return,作用相当于break,提前退出. 4.一个返回类型是void的函数也可以使用return expression形式,不过return语句的expression必须是另