构造函数和拷贝构造的N种调⽤情况
来源:互联网 发布:java bufferedreader 编辑:程序博客网 时间:2024/06/05 13:26
1:C++对传参和传返回值时构造的优化处理
传参数时,传引用比传值减少一次拷贝构造; 传返回值时,编译器会进行优化,返回值在一个表达式内也会进行优化。
一般而言,调用构造和拷贝构造的次数 = 调用析构函数的次数。
2:讨论传值和传返回值得各种情况
先写一个Date类,以它的调用情况为例:
#include<iostream>using namespace std;class Date{public: Date() { cout<<"Date()"<<endl; } Date(const Date& d) { cout<<"Date(const Date& d)"<<endl; } Date& operator=(const Date& d) { cout<<"Date& operator=(const Date& d)"<<endl; return *this; } ~Date() { cout<<"~Date()"<<endl; }};
情况1:
//Date对象做参数:传值&传引用//void fun1(Date d)//传值//{}void fun1(Date& d)//传引用{}int main(){ Date d1; //构造一次 fun1(d1); //传值时,会调用一次拷贝构造,传引用减少拷贝构造 return 0;
运行结果:传值:
传引用:
情况2:
//Date对象做返回值//Date fun2 () //传值//{// Date d ;//会调用一次构造// return d ;//返回值时会产生临时变量(一次拷贝),临时变量再返回(一次拷贝),编译器优化只会调用一次拷贝构造//} Date& fun2() //传引用{ Date d;//只调一次构造返回引用,不会产生临时变量 return d;//返回引用,不会产生临时变量}int main(){ fun2(); return 0;}
运行结果:
传值:
传引用:
情况3:
将情况2的主函数改为:
int main() { Date d2 = fun2(); //1.一个表达式会进行优化 //Date d2; //2. //d2 = fun2; return 0; }
1.的运行结果:
传值:
传引用:
2.的运行结果:
传值:
传引用:
这说明,当是一个表达式时,会进行优化,Date d2 = fun2()。
情况4:
运行结果:
//Date对象做临时返回值:传值&传引用(编译器优化问题)//Date fun3() //{// return Date();//返回值时会产生临时变量(一次拷贝),Date()会调用一次构造,编译器会将其优化成一次构造,临时变量返回(一次构造)和优化的一次构造总共优化成一次构造。//}Date& fun3(){ return Date();//返回引用,则Date()会调用一次构造,没有临时变量的开销}int main(){ fun3(); return 0;}
传值:
传引用:
和情况2的区别:对象做返回值,在返回的时候是已经构造好了的;对象做临时返回值,在返回的时候还没有构造好,得先拷贝到临时变量,在进行构造。
3.面试题:
完成下面的题目。
Test1中调用了 2 次AA的拷贝构造函数,1次AA的赋值运算符函数的重载。
Test2中调用了2次AA的拷贝构造函数,0次AA的赋值运算符函数的重载。
Test3中调用了3次AA的拷贝构造函数,0次AA的赋值运算符函数的重载。
class AA{public: AA() { cout<<"AA"<<endl; } AA(const AA& a) { cout<<"AA(const AA& a)"<<endl; } AA& operator=(const AA& a) { cout<<"AA& operator=(const AA& a)"<<endl; return *this; } ~AA() { cout<<"~AA()"<<endl; }};AA f(AA a){ return a ;}void Test1(){ AA a1 ;//一次构造 a1 = f(a1); //f(a1)传值会调用一次拷贝构造 //返回值时会产生临时变量(一次拷贝),临时变量再返回(一次赋值运算符的重载)}void Test2(){ AA a1 ;//一次构造 AA a2 = f(a1);//f(a1)传值会调用一次拷贝构造, //返回值时会产生临时变量(一次拷贝),临时变量再返回(一次拷贝),编译器优化只会调用一次拷贝构造}void Test3(){ AA a1 ; AA a2 = f(f(a1)); //f(a1)传值会调用一次拷贝构造 //f(a1)返回值时会产生临时变量(一次拷贝),临时变量再返回(一次拷贝),编译器优化只会调用一次拷贝构造 //f(f(a1))返回值时会产生临时变量(一次拷贝),临时变量再返回(一次拷贝),编译器优化只会调用一次拷贝构造}int main(){ //Test1(); //Test2(); Test3(); return 0;}
分析:
Test1运行结果:
Test2运行结果:
Test3运行结果:
阅读全文
0 0
- 构造函数和拷贝构造的N种调⽤情况
- 讨论构造拷贝构造函数的N种调用情况
- 构造、拷贝构造的N种情况
- 构造函数拷贝赋值函数的N种调用情况
- C++传参构造的优化和讨论构造拷贝构造N中调用情况
- 拷贝构造的N种情况
- 构造拷贝构造的N中调用情况的问题
- 【C++】构造拷贝构造的 N 中调用情况
- 构造拷贝构造的N种调用情况
- 讨论构造、拷贝构造的N种调用情况
- 【c++】构造拷贝构造的N种调用情况问题
- 讨论构造拷贝构造的N种调用情况问题
- 构造,拷贝构造的N种调用情况
- 构造&拷贝构造的N中调用情况
- 构造和拷贝构造的N种调用情况的问题
- 拷贝构造函数调用的情况
- C++构造拷贝中拷贝的N种调用情况
- 论构造函数和拷贝构造函数的调用情况(优化)
- C++ 第三章标准库类型
- MySQL 正则表达式
- JavaScript(js)处理的HTML事件、键盘事件、鼠标事件
- #HDU 1087 最大递增子序列和
- 基于Node.js搭建集成自动化测试环境的基本步骤
- 构造函数和拷贝构造的N种调⽤情况
- JS基础语法--文档就绪函数
- MySQL 事务
- shell趣味编程:求两数最大公因数
- VINS-Mono源码解析(一)系统框架
- STL 中优先队列的使用方法(priority_queu)
- IDA权威指南阅读笔记3
- 2017 Multi-University Training Contest 1 && HDOJ 6038 Function 【强连通找环】
- 扩展阅读 扁鹊的医术与伯乐