【发布时间】:2014-11-16 05:41:11
【问题描述】:
考虑以下代码:
#include <iostream>
using namespace std;
class loc
{
int longitude, latitude;
public:
loc() {}
loc(int lg, int lt)
{
longitude = lg;
latitude = lt;
}
loc(const loc& l)
{
cout << "a" << endl;
}
loc operator = (loc op2)
{
longitude = op2.longitude;
latitude = op2.latitude;
return *this;
}
loc operator+(loc op2);
};
loc loc::operator+(loc op2) {
loc temp;
temp.longitude = op2.longitude + longitude;
temp.latitude = op2.latitude + latitude;
return temp;
}
int main()
{
loc ob1(10, 20), ob2( 5, 30);
ob1 = ob1 + ob2;
return 0;
}
使用命令:g++ file.cpp 编译此程序时,输出为:
a
hello
然后使用命令编译这个程序:g++ -fno-elide-constructors file.cpp,输出为:
a
a
a
hello
我的问题是:
在第一种情况下,为什么省略了两个复制构造函数?
到底哪些复制构造函数被省略了? =运算符或+运算符是否有不同的机制
编辑
我知道正确的赋值运算符或复制构造函数应该是什么样子。请回答为什么在上述情况下省略了两个复制构造函数而不是更正赋值运算符。
【问题讨论】:
-
复制构造函数被省略,因为标准特别允许这种行为。
-
这个类不需要自定义复制构造函数和赋值运算符。您的赋值运算符是错误的,因为它应该返回一个非常量引用。
-
@AlokSave:我在问为什么省略了两个复制构造函数。通常只会省略一个。
-
您的赋值运算符具有未定义的行为。您没有从中返回任何内容,并且返回类型不是 void。
-
@BenjaminLindley:进行了编辑。仍然得到相同的输出。
标签: c++ operator-overloading copy-constructor return-value-optimization copy-elision