拷贝构造函数被调用的情形
今天老师问一道题:
C/C++ code
#include<iostream>
usingstd::cout;
usingstd::endl;
classMyClass
{
public:
MyClass(int a=0,int b=0) { m = a+b; count++; }
MyClass(MyClass& ob) { m =ob.m; count++; }
static int count;
private:
int m;
};
intMyClass::count=0;
MyClass fun(MyClass& ob)
{
MyClass myob = ob;
return myob;
}
intmain()
{
MyClass obar[3];
fun(obar[0]);
cout<<MyClass::count<<endl;
}
写输出结果。当时答4,老师说答案是5.回来后测试了一下,MinGW下是4,VC6.0下是5。求解,返回值为类对象时到底会不会调用拷贝构造函数?C++标准有这方面的说明吗?
答案:
1. 这就是理论与现实的差别,
Google “具名返回值优化”
2. A:
3.#include<iostream>
4.using std::cout;
5.using std::endl;
6.class MyClass
7.{
8.public:
9. MyClass(int a=0,int b=0) { m = a+b; count++; }
10. MyClass(MyClass& ob) { m = ob.m; count++; }
11. static int count;
12. private:
13. int m;
14. };
15. int MyClass::count=0;
16. MyClass fun(MyClass& ob)
17. {
18. MyClass myob = ob;//4
19. return myob;//5你返回值还要占用一个拷贝构造函数
20. }
21.
22. int main()
23. {
24. MyClass obar[3];//3
25. fun(obar[0]);
26. cout<<MyClass::count<<endl;
27. }
28.
B:
#include<iostream>
using std::cout;
using std::endl;
class MyClass
{
public:
MyClass(int a=0,int b=0) { m = a+b; count++; }
MyClass(MyClass& ob) { m = ob.m; count++; }
static int count;
private:
int m;
};
int MyClass::count=0;
MyClass & fun(MyClass& ob)//这样修改就是4 按引用和值拷贝
{
MyClass myob = ob;//4
return myob;
}
int main()
{
MyClass obar[3];//3
fun(obar[0]);
cout<<MyClass::count<<endl;
}
具体的设计一些编译器的优化 不过一般的还是5
3.int MyClass::count=0;
MyClass fun(MyClass& ob)
{
MyClass myob = ob;
return myob;
}
构造函数3个,myob初始化(MyClass myob = ob;这里调用的是拷贝构造函数)1个,返回值1个,共5