8

可能重复:
复制和直接初始化行为不同的动机是什么?

通过复制初始化,我的意思是这样的:

struct MyStruct
{
    MyStruct(int) {}
    MyStruct(const MyStruct&) {}
};

MyStruct s = 5; // needs *both* the int and copy constructor

尽管使用 C++ 编程多年,但我从未意识到上面的代码需要复制构造函数(感谢 jogojapan)。临时性总是被忽略,因此我什至不知道它甚至存在(至少在表面上,尽管它被优化掉了),直到它被指出给我。

经过大量的谷歌搜索后,我明白了它是如何工作的。我的问题是为什么会这样?

为什么标准没有使上面的示例不需要复制构造函数?是否有一些特定的案例/示例表明在这种类型的初始化中需要复制构造函数很重要?

如果没有一个体面的解释为什么事情会这样,我只是认为这是一个令人讨厌的人工制品,但如果我遗漏了一些重要的东西,我宁愿不要无知。

4

1 回答 1

0

对象的复制初始化与直接初始化是模棱两可的,两者可以在相同程度上用于设置彼此相等的值。

int a = 4;
int a = int(4);
int a(4);

所有这些调用都是模棱两可的,它们都将 a 设置为 4。在整数的情况下使用复制构造函数的原因是方便,想象一下没有 this 的 c++ 数据类型

int a(foo(b,r)); //a little messy for a variable declaration
int a = foo(b,r) //ok, cleaner

您也可能会使用隐式和显式复制构造函数,这是一个示例程序,它显式使用复制构造函数来处理虚数:

#include <iostream>
using std::cout;
using std::endl;
class complexNumbers {
  double real, img;
public:
  complexNumbers() : real(0), img(0) { }
  complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
  explicit complexNumbers( double r, double i = 0.0) { real = r; img = i; }
  friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
  cout<<&quot;Real Part: &quot;<<cx.real<<&quot; Imag Part: &quot;<<cx.img<<endl;
}
int main() {
  complexNumbers one(1);
  display(one);
  complexNumbers two =2;
  display(200);
  return 0;
}
于 2012-12-04T04:37:00.510 回答