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 ;
} cout<<+(b=a)<<endl; //
结果,(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 constructor
copy assignment constructor 2)赋值构造函数返回值为非引用类型
copy assignment constructor
copy constructor
copy assignment constructor
copy constructor
我们看到赋值构造函数返回值为非引用类型时,导致系统为其拷贝生成两个临时变量
虽然最后达到的目的一致,但是增加了内存开支
综上,复制构造函数的返回值为引用类型比较好,在给多个对象赋值时,可以节省内存开支,在进行链式操作时,不但可以节省内存开支,还可以对其进行修改性操作
C++ 赋值构造函数的返回值到底有什么用?且返回值是否为引用类型有什么区别吗?的更多相关文章
- C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导 ...
- c++赋值构造函数为什么返回引用类型?
目录 0 前言 1 内置类型 2 自定义类型 3 结论 4 源码 0. 前言 c++默认赋值构造函数的返回值是引用类型,c++赋值运算符=的本意是返回左值的引用,我们重载赋值构造函数的时候,返回值是否 ...
- Java的Object.hashCode()的返回值到底是不是对象内存地址?
关于这个问题,查阅了网上的资料,发现证明过程太繁琐,这里我用了反证法. java.lang.Object.hashCode()的返回值到底是不是对象内存地址? hashCode契约 说到这个问题,大家 ...
- out.println(session.getLastAccessedTime());的返回值到底是毛线意思???
out.println(session.getLastAccessedTime());这个语句是输出最后一次成功获取session对象Attribute值的一个指令, 他的返回值是一个long型数据, ...
- (copy)赋值构造函数的4种调用时机or方法
第一种调用方法: demo #include <iostream> using namespace std; class Text { public: Text() // 无参数构造函数 ...
- c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数
每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...
- C++类中函数(构造函数、析构函数、拷贝构造函数、赋值构造函数)
[1]为什么空类可以创建对象呢? 示例代码如下: #include <iostream> using namespace std; class Empty { }; void main() ...
- 调试台自动多出现一个'' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个''
对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...
随机推荐
- python TextMining
01.Crawling url_request # -*- coding: utf-8 -*- """ Created on Sun Feb 17 11:08:44 20 ...
- P4147 玉蟾宫 二维DP 悬线法
题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...
- React十进制和二进制转换的实现和分析
[描述] 模仿官方文档的摄氏度和华氏度的转换,实现十进制和二进制的互换. [实现] import React from 'react'; import ReactDOM from 'react-dom ...
- Python 30分钟快速入门指南
学习地址 中文版:Python 30分钟入门指南 英文版:Learn X in Y minutes 学习时间 2019/03/10 19:00 - 19:32,多用了2分钟.
- [转] Java程序员学C#基本语法两个小时搞定(对比学习)
Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...
- Codeforces.871D.Paths(莫比乌斯反演 根号分治)
题目链接 \(Description\) 给定\(n\),表示有一张\(n\)个点的无向图,两个点\(x,y\)之间有权值为\(1\)的边当且仅当\(\gcd(x,y)\neq1\).求\(1\sim ...
- [CQOI2015]网络吞吐量
Description: 给你一个图,每个点可以被经过\(a_i\)次,求有多少个人可以走最短路到n点 Hint: \(n \le 500\) Solution: 极其水的一道题,就当做复习最短路板子 ...
- JavaScript(三)
函数 函数就是重复执行的代码片. 函数定义与执行 <script type="text/javascript"> // 函数定义 function aa(){ aler ...
- 09-Http & Servlet
Http协议&Servlet Http协议 什么是协议 > 双方在交互.通讯的时候, 遵守的一种规范.规则. http协议 > 针对网络上的客户端 与 服务器端在执行http请求的 ...
- centos7下部署nginx与php
背景介绍 相信读者在看这篇文章之前已经fastcgi,php-fpm有所了解.大概来讲php语言需要fastcgi程序,即php解释器解释,而php解释器需要php-fpm管理器进行调度. 以下对CG ...