为什么X(X&)可以被调用两次?

Tia*_*ian 3 c++ constructor destructor

我写了这段代码:

    struct X{
        int val;

        void out(const string& s, int nv)
            {cerr<<this<<"->"<<s<<": "<<val<<"("<<nv<<")\n";}

        X() {out("X(int)",0); val=0;}
        X(int v){out("X(int)",v); val=v;}
        X(const X& x){out("X(X&)",x.val); val=x.val;}
        X& operator=(const X& a)
            {out("X::operator=()",a.val); val=a.val; return *this;}
        ~X() {out("~X()",0);}
    };

    X copy(X a) {return a;}

    int main{
        X loc2;
        X loc(5);
        loc2 = copy(loc);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

输出是这个(在VS2010中):

003BFAA0->X(int): -858993460(0)
003BFA94->X(int): -858993460(5)
003BF964->X(X&): 723486321(5)
003BF994->X(X&): -858993460(5)
003BF964->~X(): 5(0)
003BFAA0->X::operator=(): 0(5)
003BF994->~X(): 5(0)
Run Code Online (Sandbox Code Playgroud)

前两行很好.但第三和第四行表明它调用了X(X&)两次.副本(X a)中只有一个"X a".为什么X(X&)可以被调用两次?

Alo*_*ave 6

为什么X(X&)可以被召唤两次?

随着函数调用:

loc2 = copy(loc);    
Run Code Online (Sandbox Code Playgroud)

copy(loc); 调用复制构造函数两次:

  1. 创建loc传递给函数的参数副本.
  2. 创建返回对象的副本a.

在C/C++中,函数的参数默认按值传递.所以不是实际的参数,而是在函数调用中收到传递的对象/变量的副本.这个副本是通过调用复制构造函数创建的.
您的copy()函数也会再次按值返回,从而导致调用复制构造函数.

请注意,在某些情况下,编译器可能会删除(删除)对复制构造函数的调用并构造内联对象,这种现象称为复制删除.通常,您不应该根据复制的次数编写任何产生副作用的代码正在调用构造函数.