c++拷贝构造函数有关问题求指点
c++拷贝构造函数问题求指点网上说这个函数的运行会调用拷贝构造函数但是为什么运行后 copy 这个字符串不会
c++拷贝构造函数问题求指点
网上说这个函数的运行会调用拷贝构造函数 但是为什么运行后 copy 这个字符串不会打印 也就是说没有调用拷贝构造函数吗?
class CExample
{
private:
int a;
public:
//构造函数
CExample(int b)
{
a = b;
}
//拷贝构造
CExample(const CExample& C)
{
a = C.a;
cout<<"copy"<<endl;
}
void Show ()
{
cout<<a<<endl;
}
};
//全局函数
CExample g_Fun()
{
CExample temp(0);
return temp;
}
int main()
{
g_Fun();
return 0;
}
[解决办法]这种情况是标准允许的返回值优化,直接把函数体内返回的对象当成外面被返回的对象再用了
[解决办法]你说的这种情况,已经被编译器给优化了,不会调用拷贝函数。现在的编译器都会把这个作为默认优化,关闭优化也没用。不知道老一点的编译器上是不是还能看到...
[解决办法]这个我就不知道了...我试过,也在网上看到过,但具体文档就不知道了,你可以自己去查查看。
[解决办法]的确是调用了,C++ Primer也提到过,但是被编译器优化了。因为对临时对象调用copy没有意义。
[解决办法]忘记了,好像是在讲拷贝函数的时候吧...
------解决方案--------------------
这种叫RVO
Return Value Optimization
返回值优化
[解决办法]对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
[解决办法]标准规定的东西通过调试是看不到的。调试只能反映出你手上拿到的编译器的具体行为,但是编译器本身却不会告诉你它为什么要设计成具有这样的行为。这些你只能找到原始的标准文档才能知道。毕竟不同厂商的编译器都得按照标准文档的要求去设计。编译器要和标准规定的行为相一致,而不是标准根据某家编译器的具体行为编写出来的。搞清楚
[解决办法]像RVO这种,标准规定编译器可实现可不实现,但是建议实现的功能。而开发人员需要了解编译器可能会做RVO,从而导致一些后果,应当避免把自己的类设计成对是否做了拷贝构造会导致不同行为的。
[解决办法]
你那样的代码,没任何意义,甚至会被优化掉,拷贝构造函数,在赋值,传递值等过程中才会触发