C++中用函数返回值初始类对象时的一个问题
来源:互联网 发布:微商比淘宝价格贵在哪 编辑:程序博客网 时间:2024/05/06 11:37
问题:
有一个类,名字是C,假设有一个函数,它的定义为:
- C func()
- {
- C tmp;
- return tmp;
- }
即返回C类型的函数,那么考虑表达式C newC = func();将调用几次构造函数?分别是什么类型的构造函数?
解答:
<<C++ primer>>里有提到这个过程,首先会创建一个临时的类对象,该对象是由复制构造函数生成,参数是tmp。然后再调用复制构造函数初始化newC。所以一共调用了两次复制构造函数。
但现在的gcc不这么处理,会做一个优化。在C函数里有个tmp变量,离开func时不撤销这个对象,而是让newC和这个对象关联起来。也就是说tmp的地址和newC是一样的。
实验:
- #include <iostream>
- using namespace std;
- class test
- {
- private:
- int num;
- static int total ;
- public:
- test()
- {
- num = 0 ;
- cout << "in the default constructor\n" ;
- total ++;
- }
- test(const test& a )
- {
- num = a. num;
- cout << "in the copy constructor\n" ;
- total ++;
- }
- test(int a)
- {
- num = a;
- cout << "in the one-para constructor\n" ;
- total ++;
- }
- test& operator=(const test& a )
- {
- num = a. num;
- cout << "in the assign op\n" ;
- return * this;
- }
- static void print ()
- {
- cout << total << endl;
- }
- int showa ()
- {
- return num;
- }
- };
- int test:: total = 0;
- test testfunc(test t )
- {
- cout << "1\n";
- test tmp(5 );
- cout << "address of tmp:" << &tmp << endl ;
- cout << "2\n";
- return tmp ;
- }
- int main()
- {
- test para;
- test result = testfunc (para);
- cout << "address of result:" << &result << endl ;
- cout << "result.a = " << result.showa () << endl;
- cout << "3\n";
- test::print ();
- return 0;
- }
那个static变量用来记录一共调用了几次构造函数。
结果:
解释:
第1行是因为test para;调用了默认构造函数。
第2行是因为把para传给函数形参调用了赋值构造函数。
第3行表明进入了testfunc()
第4行tmp调用参数为int的构造函数
第5行输出tmp的地址
第6行表明要离开函数
第7行输出result的地址,发现和tmp的地址是一样的
0 0
- C++中用函数返回值初始类对象时的一个问题
- C++中用函数返回值初始类对象时的一个问题
- C++中用函数返回值初始类对象时的一个问题
- 关于函数的返回值是一个接口类型的对象
- Javascript函数返回值的一个问题(显式返回和非显式返回值的问题)
- android TextView刷新时ImageView返回初始位置的问题
- 函数的返回值和临时对象的问题
- 返回临时对象时的拷贝构造函数问题
- 函数返回值为指针的一个陷阱(使用inet_ntoa函数时遇到的问题)
- 函数返回文档对象的问题
- C`函数的返回值为一个二维数组
- 在excel中用VLOOKUP函数应注意的一个问题
- 关于局部函数返回值的一个有趣问题
- VC++6.0中,返回值为一个结构体时,对象复制2次的问题
- C语言scanf()函数返回值的问题
- C语言函数返回值的相关问题
- C语言之函数返回值的问题
- C语言函数返回值的相关问题
- iOS推送证书过期处理方法
- 归并排序
- 黑盒测试
- 递归优化之尾递归
- Python设定ftplib,httplib,urllib等的timeout值
- C++中用函数返回值初始类对象时的一个问题
- HDU 5088 Revenge of Nim II
- C++处理字符串
- Java中HashMap实现原理初探
- HTTP状态码
- Android之Context 和 application context
- 【Linux】RedHat9.0 利用sftp传文件
- 欢迎使用CSDN-markdown编辑器
- c中不安全的函数