Gau*_*v K 0 c++ copy-constructor assignment-operator
考虑一个类:
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();
};
Run Code Online (Sandbox Code Playgroud)
当我调用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;
}
Run Code Online (Sandbox Code Playgroud)
它不会调用复制构造函数,因为它通过引用返回:
输出:
Constructor loc() Called
########
Enter x cordinate : 10
Enter y cordinate : 10
Ob : x : 10 y : 10
########
Constructor loc() Called
Ob1 : x : 10 y : 10
Run Code Online (Sandbox Code Playgroud)
但是因为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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这种行为?
编辑
请注意这不是复制省略的情况下,如果我被退回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
.....
};
Run Code Online (Sandbox Code Playgroud)
允许编译器在特定场景中跳过调用复制构造函数,这是其中之一,即使它产生了明显的变化(正如您刚刚经历的那样).这是一种常见的技术,称为命名返回值优化(NRVO),其中返回的变量是在适当的位置构建的,而不是创建和复制的.
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |