C++拷贝构造函数心得
C++Primer作者提到拷贝构造函数调用的三种时机:
1. 当用一个类对象去初始化另外一个类对象(类似于 AClass aInstance = bInstance),这里不是调用赋值构造函数(也叫赋值重载运算符)。复制是说初始化,赋值是初始化后重新覆盖旧值
2.函数形参是类对象
3.函数返回值为对象,函数执行完返回时会生成一个临时对象,将值复制给临时对象
但是下列代码验证时发现 第三个返回值是对象时并没有调用拷贝构造函数
class ZooAnimal
{
public:
ZooAnimal() : loc (1){}
ZooAnimal(const ZooAnimal &lhs) {
this->loc = lhs.loc;
cout << "copy construct" << endl;
}
virtual ~ZooAnimal() { cout << "deconstructer" << endl; }
virtual void rotate()
{
cout << "ZooAnimal" << endl;
cout << loc << endl;
}
public:
int loc;
string name;
}; ZooAnimal func()
{
ZooAnimal x;
x,loc = 2;
return x;
} int main(int argc, char* argv[])
{
func();
return 0; }
原因是在C++Primer的作者在《深度探索C++对象模型》一书中提到,编译器会进行优化,返回值在参数采用引用的方式
func优化为
ZooAnimal func(ZooAnimal &_hiddenArg)
{
hiddenArg.loc =;
return;
}
g++ main.cpp -o test -fno-elide-constructors 可关闭优化
结果打印
copy construct
C++拷贝构造函数心得的更多相关文章
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...
- C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导 ...
- C++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数: X::X(const X&); X::X(X& ...
- PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天
PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1 关于转换构造函数 ClassDemo demo = 1; 调用转换构造函数 2 关于拷贝赋值函数 demo =2; 首 ...
- C++拷贝构造函数(深拷贝,浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #i ...
- C++ 拷贝构造函数 和 六大函数
1. C++什么时候会调用 拷贝构造函数? a.一个对象作为函数参数,以值传递的方式传入函数体: b.一个对象作为函数返回值,以值传递的方式从函数返回:(实际使用时,会被编译器优化掉) c.一个对象 ...
- 一个CString的实现 拷贝构造函数的应用
class CString { public: CString (char* s); CString(); ~CString(); private: char *str; int len; stati ...
- 【转】C++的拷贝构造函数深度解读,值得一看
建议看原帖 地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...
随机推荐
- Big Data(八)MapReduce的搭建和初步使用
---恢复内容开始--- 回顾: 1.最终开发MR的计算程序 2.hadoop 2.x 出现了一个yarn:资源管理>>MR没有后台场服务 yarn模型:container 容器,里面会运 ...
- visual studio密钥
企业版:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 专业版:KBJFW-NXHK6-W4WJM-CRMQB-G3CDH
- Tableau Dashboard
Dashboard仪表盘,用来展示多个图表,并展示之间的联动,分析数据.
- ios银行卡号加入* 并四个一个空格
+(NSString *)getNewBankNumWitOldBankNum:(NSString *)bankNum{ NSMutableString *mutableStr; if ( ...
- Python开发WebService:REST,web.py,eurasia,Django
Python开发WebService:REST,web.py,eurasia,Django 博客分类: Python PythonRESTWebWebServiceDjango 对于今天的WebSe ...
- 《Python3-标准库》讲解
一.string:文本常量和模板 函数:capwords()-------------------------------------------------- import string s = ...
- 【NOIP2017提高组模拟12.24】B
题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...
- electron-vue 图片加载失败后使用默认头像
<img :src="item.headUrl" alt="" class="contact-head" :onerror=" ...
- chrome scrollTop 获取失败问题及解决方案
https://blog.csdn.net/h357650113/article/details/78384621
- 引用自定义的css或者js文件
用script标签,src是js文件路径 <script type="text/javascript" src="./js/udc.js">< ...