gpt4 book ai didi

c++ - 为什么 X(X&) 可以调用两次?

转载 作者:太空狗 更新时间:2023-10-29 20:15:33 24 4
gpt4 key购买 nike

我写了这段代码:

    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;
}

输出是这样的(在 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)

前两行没问题。但是第三行和第四行显示它调用了两次 X(X&)。拷贝(X a)中只有一个“X a”。为什么 X(X&) 可以被调用两次?

最佳答案

Why X(X&) could be called for two times?

函数调用:

loc2 = copy(loc);    

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

  1. 创建传递给函数的参数 loc 的拷贝。
  2. 创建返回对象 a 的拷贝。

在 C/C++ 中,函数的参数默认按值传递。因此,在函数调用中收到的不是实际参数,而是传递的对象/变量的拷贝。此拷贝是通过调用复制构造函数创建的。
您的 copy() 函数还按值返回 再次导致调用复制构造函数。

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

关于c++ - 为什么 X(X&) 可以调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12739452/

24 4 0
文章推荐: c++ - 如何确保一次只有一个进程访问共享内存
文章推荐: c++ - "enum class"在 Visual C++ 2012 中是什么意思?
文章推荐: c# - 要列出的数据表