考虑一个类:
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();
};
当我调用赋值运算符时:
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
它是由 value 返回的,但是在输出中我看不到复制构造函数被调用:
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
有人可以解释为什么这种行为吗?
编辑
请注意,这不是复制省略的情况,就像我通过loc
ie 而不是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
.....
};