考虑一个班级:
class loc{
int x;
int y;
public:
loc();
loc(int x,int y);
loc(const loc& l);//Copy Constructor
loc operator + (const loc& l);
loc operator - (const loc& l);
loc& operator = (const loc& l);//Assignment Operator
const loc& operator ++ ();
friend ostream& operator << (ostream& os,const loc& l);
friend istream& operator >> (istream& is,loc& l);
~loc();
};
当我调用Assignment运算符时:
int main()
{
loc Ob;
cout << "########\n\n";
cin >> Ob;
cout << "Ob : " << Ob;
cout << "\n\n########\n\n";
loc Ob1;
Ob1=Ob;
cout << "Ob1 : " << Ob1;
return 0;
}
它不会调用复制构造函数,因为它是通过引用返回的:
输出:
Constructor loc() Called
########
Enter x cordinate : 10
Enter y cordinate : 10
Ob : x : 10 y : 10
########
Constructor loc() Called
Ob1 : x : 10 y : 10
但对于loc operator + (const loc& l)
,它应该在返回temp
时调用复制构造函数 - 因为loc
是由值返回的,但是在输出中我看不到被调用的复制构造函数:
loc loc::operator + (const loc& l)
{
loc temp;
temp.x = this->x + l.x;
temp.y = this->y + l.y;
return temp;
}
输出:
int main()
{
loc Ob;
cout << "########\n\n";
cin >> Ob;
cout << "Ob : " << Ob;
cout << "\n\n########\n\n";
loc Ob1;
Ob1=Ob;
cout << "Ob1 : " << Ob1;
cout << "\n\n########\n\n";
loc Ob3;
Ob3 = Ob1 + Ob;
cout << "Ob3 = Ob1 + Ob : " << Ob3;
return 0;
}
Constructor loc() Called
########
Enter x cordinate : 10
Enter y cordinate : 10
Ob : x : 10 y : 10
########
Constructor loc() Called
Ob1 : x : 10 y : 10
########
Constructor loc() Called
Constructor loc() Called
Destructor Called
Ob3 = Ob1 + Ob : x : 20 y : 20
有人可以解释为什么会出现这种情况吗?
修改
请注意,这不是复制Elision的情况,就好像我在loc
返回,即在赋值运算符中返回loc&
- 我可以看到在loc
中返回assignment operator
时调用的复制构造函数}以及+ operator
。因此,+operator
在loc
使用assignment operator
时会出现这种情况。我想知道如何从函数返回一个值,内部细节如何创建临时返回值并分配返回值。
下面的类显示了在返回loc operator + (const loc& l)
以及loc operator = (const loc& l)
时调用的复制构造函数
class loc{
....
loc(const loc& l);//Copy Constructor
loc operator + (const loc& l);
loc operator = (const loc& l);//Assignment Operator
.....
};
答案 0 :(得分:6)
允许编译器在特定场景中跳过调用复制构造函数,这是其中之一,即使它产生了明显的变化(正如您刚刚经历的那样)。这是一种常见的技术,称为命名返回值优化(NRVO),其中返回的变量就地构建而不是创建和复制。