可能的重复:
复制和直接初始化行为不同的动机是什么?
所谓的复制初始化,我的意思是这样的:
struct MyStruct
{
MyStruct(int) {}
MyStruct(const MyStruct&) {}
};
MyStruct s = 5; // needs *both* the int and copy constructor
尽管用C++编程多年,但我从未意识到上面的代码需要复制构造函数(感谢jogojapan)。临时性一直被忽略,因此我甚至不知道它的存在(至少在表面上,尽管它被优化了),直到它被指出给我
经过相当多的谷歌搜索,我知道了它是如何工作的。我的问题是为什么是这样?
为什么标准没有让上面的例子不需要复制构造函数?是否有一些特定的案例/示例表明在这种类型的初始化中需要复制构造函数很重要?
如果不能很好地解释为什么事情是这样的,我只是觉得这是一个令人讨厌的人工制品,但如果我错过了一些重要的东西,我宁愿不知道。
复制对象的初始化与直接初始化不明确,两者可以在相同的程度上使用,以便将值设置为彼此相等。
int a = 4;
int a = int(4);
int a(4);
所有这些调用都是不明确的,它们都设置了一个等于4的值。在整数的情况下,复制构造函数的原因是方便,想象一下没有这个的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<<"Real Part: "<<cx.real<<" Imag Part: "<<cx.img<<endl;
}
int main() {
complexNumbers one(1);
display(one);
complexNumbers two =2;
display(200);
return 0;
}