0

考虑一个类:

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

有人可以解释为什么这种行为吗?

编辑 请注意,这不是复制省略的情况,就像我通过locie 而不是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
    .....
    };
4

1 回答 1

6

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

于 2013-05-16T13:29:15.830 回答