Aqu*_*irl 10 c++ pointers reference copy-constructor
为什么复制构造函数的参数是引用而不是指针?
为什么我们不能使用指针代替?
Nic*_*las 13
原因有很多:
引用不能为NULL.好的,可以创建NULL引用,但也可以将a std::vector<int>*
转换为std::vector<SomeType>*
.这并不意味着这样的演员有定义的行为.并且都没有创建NULL引用.指针在设置为NULL时定义了行为; 参考文献没有.因此,总是希望引用引用实际对象.
变量和临时变量不能隐式转换为指向其类型的指针.原因很明显.我们不希望指向临时运行的指针,这就是为什么标准明确禁止这样做(至少在编译器可以告诉你这样做的时候).但我们可以参考它们; 这些是隐式创建的.
由于点号2,使用指针而不是引用将要求每个复制操作使用地址运算符(&).哦等等,C++委员会愚蠢地允许它超载.因此,任何复制操作都需要实际使用std::addressof
C++ 11功能来获取地址.所以每个副本都需要看起来像Type t{std::addressof(v)};
或者你可以只使用引用.
这只是命名法.您也可以使用指针,但这被称为转换构造函数.
如果你考虑它,它是有道理的,因为你将一个对象复制到另一个对象(比如"复制").不是指向对象的指针.如果它是一个指针,它就不会复制,因为你没有将指针复制到对象,而是指针指向对象的对象.
因为标准拒绝了这一点.
引自C++草案标准n3376 - 第12.8.2节:
如果X类的第一个参数是X&,const X&,volatile X&或const volatile X&,并且没有其他参数或者所有其他参数都有默认参数,则X类的非模板构造函数是一个复制构造函数
为什么它应该是一个指针?空指针没有意义.并且使用指针不允许复制临时对象,因此您无法执行以下操作:
MyClass
func()
{
// ...
return MyClass(...);
}
Run Code Online (Sandbox Code Playgroud)
您可以定义一个带指针的构造函数.但它不是复制构造函数,因为它不能用于上述情况.并且它不会禁止编译器生成复制构造函数.