Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';t我们在c+中的复制构造函数中使用传递指针+;? 我知道C++中复制构造函数的一般语法可以参考。 但是,我的疑问是,如果我们使用指针类型而不是引用,会发生什么?为什么我们不在复制构造函数中使用指针传递机制呢? 它的主要缺点是什么?_C++_C++11_Constructor_Copy Constructor - Fatal编程技术网

为什么可以';t我们在c+中的复制构造函数中使用传递指针+;? 我知道C++中复制构造函数的一般语法可以参考。 但是,我的疑问是,如果我们使用指针类型而不是引用,会发生什么?为什么我们不在复制构造函数中使用指针传递机制呢? 它的主要缺点是什么?

为什么可以';t我们在c+中的复制构造函数中使用传递指针+;? 我知道C++中复制构造函数的一般语法可以参考。 但是,我的疑问是,如果我们使用指针类型而不是引用,会发生什么?为什么我们不在复制构造函数中使用指针传递机制呢? 它的主要缺点是什么?,c++,c++11,constructor,copy-constructor,C++,C++11,Constructor,Copy Constructor,通过引用传递可确保将实际对象传递给复制构造函数,而指针可能具有空值,并使构造函数失败。从技术上讲,您可以编写一个使用指针的构造函数(虽然在技术上,这不是一个拷贝构造函数,而是基于规范的措辞)。但是,这阻止了你使用不可寻址的结果。考虑我们有一个大的数学类(多精度): 无法获取表达式a*3的地址,因此仍然需要对象的const bigmath&版本 (正如巴特所说,这也确保了这个物体是一个“适当的物体”,这也不会造成伤害——但对我来说,以上是一个更有力的论点) 我也许应该补充一点,您为对象选择的构造函

通过引用传递可确保将实际对象传递给复制构造函数,而指针可能具有空值,并使构造函数失败。

从技术上讲,您可以编写一个使用指针的构造函数(虽然在技术上,这不是一个拷贝构造函数,而是基于规范的措辞)。但是,这阻止了你使用不可寻址的结果。考虑我们有一个大的数学类(多精度):

无法获取表达式
a*3
的地址,因此仍然需要对象的
const bigmath&
版本

(正如巴特所说,这也确保了这个物体是一个“适当的物体”,这也不会造成伤害——但对我来说,以上是一个更有力的论点)

我也许应该补充一点,您为对象选择的构造函数类型实际上取决于类的作用和表示方式。有些对象的副本肯定不是“好的”,还有其他一些情况,比如
bigmath
类,其中复制构造函数绝对是件好事。对于
bigmath
类,您可能还需要一个接受长整数、双精度和字符串的构造函数。在某些情况下,拥有引用没有意义。在某些情况下,拥有常量引用没有意义在某些情况下,就像我说的,拥有一个拷贝构造函数是没有意义的


通常,您可以通过添加解引用
*ptr
操作将指针
ptr
转换为引用。因为编译器将获取该指针的地址(以便它可以传递引用),它不会添加任何额外的代码来使用它。但是为了方便起见,如果你有一个类,你经常有指向它的指针,并且你想复制它,那么有一个带指针的构造函数可能确实是有意义的。我不完全确定它会在哪里,在我的脑子里。

根据标准,复制构造函数需要g指针不存在:

[C++11:12.8/2]
:如果类
X
的非模板构造函数的第一个参数的类型为
X&
const X&
volatile X&
const volatile X&
,并且没有其他参数,或者所有其他参数都有默认参数(8.3.6)。[…]

不包括指针,因为整个引用点都是对象的别名,而指针表示间接。在不深入研究语言设计的深奥细节的情况下

你可以编写任何你想要的构造函数,如果你想它可以使用指针,但它不会是一个“复制构造函数”。它可能在所有权语义上非常不清楚和模糊,而且是非传统的,有点奇怪,这就是为什么我们不这么做的原因

这不是闻所未闻的;考虑这个构造函数是在C++中实例化一个文件流的唯一方法,直到三年前和一年前:

 explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);

根据我的说法,复制构造函数的标准是使用引用,但引用和指针都会给出相同的输出,但只要您使用引用(TestConstrutor obj2=nullptr)将nullptr分配给对象它将不允许,但若您作为指针传递,它将工作,但它将崩溃,因为您不能将空指针分配给对象

它可以正常工作: TestConstrutor(const TestConstrutor&obj)
x=obj.x;
y=obj.y;
//它将调用TestConstrutor obj1(100200);TestConstrutor obj2=obj1; TestConstrutor(const TestConstrutor*obj)
x=obj->x;
y=obj->y;
//它将调用TestConstrutor obj3=&obj2

不允许: TestConstrutor(const TestConstrutor&obj)
x=obj.x;
y=obj.y;
//TestConstrutor obj2=nullptr

它会很低,但会崩溃:- TestConstrutor(const TestConstrutor&obj)
x=obj.x;
y=对象y;
TestConstrutor(const TestConstrutor*obj)
x=obj->x;

y=obj->y;
//TestConstrutor obj2=nullptr;

编写一个采用指针而不是引用的构造函数是没有问题的。它不是复制构造函数。它是一个采用指针的构造函数。你可以问“为什么我们不能为复制构造函数传递7个字符串、12个整数和3个向量?”印度一个流行的面试问题:-)重复“不,你不能”。那不是一个复制构造函数。标准对此很清楚。什么,它不可编译,或者如果它采用
const bigmath&
object,它就不是一个合适的复制构造函数?@matstpeterson:参考我回答中引用的标准。它不需要是
const bigmath&
,但指针肯定不受欢迎。对不起,我明白你的意思了,我已经编辑了两次以更正措辞(为了更清楚),该示例有点误导,因为它包括复制和移动构造函数。
 explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);