按值返回时不复制构造函数:C ++

时间:2013-05-16 13:26:42

标签: 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();
    };

当我调用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。因此,+operatorloc使用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
    .....
    };

1 个答案:

答案 0 :(得分:6)

允许编译器在特定场景中跳过调用复制构造函数,这是其中之一,即使它产生了明显的变化(正如您刚刚经历的那样)。这是一种常见的技术,称为命名返回值优化(NRVO),其中返回的变量就地构建而不是创建和复制。