为什么我们不能在c ++的拷贝构造函数中使用指针传递?

时间:2015-01-12 08:59:48

标签: c++ c++11 constructor copy-constructor

我知道c ++中复制构造函数的一般语法会引用。    但是,我怀疑如果我们使用指针类型而不是引用会发生什么?为什么我们不在Copy构造函数中使用pass by pointer机制?    它有哪些主要缺点?

4 个答案:

答案 0 :(得分:6)

根据标准,指点的复制构造者不存在:

  

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

指针不包括在内,因为整个参考点都是" be"对象的别名,而指针表示间接。如果不深入研究语言设计的深奥细节,it's a semantic distinction that makes a lot of sense when you consider the syntactic differences between them

你可以编写你想要的任何构造函数,如果你想要它可以使用指针,但它不会成为复制构造函数"。对于所有权语义,它可能是非常不清楚和模糊的,并且是非常规的,并且有点奇怪,这就是我们不做的原因。

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

const volatile X&

答案 1 :(得分:4)

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

答案 2 :(得分:4)

从技术上讲,你可以编写一个带指针的构造函数(虽然在这种情况下它根据规范的措辞在技术上不是复制构造函数)。但是,这会阻止您使用不可寻址的结果。考虑一下我们有一个很大的数学课(多精度):

bigmath a = 14;

bigmath answer(a * 3);

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

(正如巴特所说,它也确保了物体是一个正确的物体",这也不会伤害到 - 但对我来说,上述是一个更强有力的论据。) / p>

我或许应该补充一点,您选择为对象选择的构造函数的类型实际上取决于类的作用和表示。有些对象绝对不是" good",还有其他情况,比如bigmath类,其中复制构造函数绝对是一件好事。对于bigmath类,您可能还需要一个采用长整数,双精度和字符串的构造函数。在某些情况下,提供参考并没有意义。在某些情况下,使用const引用并没有意义。在某些情况下,就像我说的那样,拥有一个复制构造函数并没有意义。

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

答案 3 :(得分:0)

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

它将正常工作:- TestConstrutor(const TestConstrutor&obj) x = obj.x; y = obj.y; //它将调用TestConstrutor obj1(100,200); 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 = obj.y; TestConstrutor(const TestConstrutor * obj)x = obj->x; y = obj->y; // TestConstrutor obj2 = nullptr;