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

vecaoik1  于 2023-01-06  发布在  其他
关注(0)|答案(5)|浏览(175)

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

k4aesqcs

k4aesqcs1#

通过引用传递确保了一个实际的对象被传递给复制构造函数,而指针可以有NULL值,并使构造函数失败。

bksxznpy

bksxznpy2#

根据该标准,不存在带指针的复制构造函数:
[C++11: 12.8/2]:类X的非模板构造函数是复制构造函数,如果它的第一个参数是X&const X&volatile X&const volatile X&类型,并且没有其他参数或者所有其他参数都有默认参数(8.3.6)。[..]
指针不包括在内,因为整个引用点都是对象的别名,而指针表示间接引用。不必深入探究语言设计的深奥细节,it's a semantic distinction that makes a lot of sense when you consider the syntactic differences between them
你可以写任何你想要的构造函数,如果你想的话,它可以接受一个指针,但它不会是一个“复制构造函数,”它可能会很不清楚,关于所有权的语义很模糊,而且是非常规的,有点奇怪,这就是为什么我们不这样做。
不过,这并非闻所未闻;考虑一下这个构造函数,直到三年多以前,它还是C++中示例化文件流的唯一方法:

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

zbwhf8kr3#

从技术上讲,你可以写一个接受指针的构造函数(尽管从技术上讲,它不是复制构造函数,基于规范的措辞)。然而,这会阻止你使用不可寻址的结果。假设我们有一个大的数学类(多精度):

bigmath a = 14;

bigmath answer(a * 3);

不能使用表达式a * 3的地址,因此仍然需要该对象的const bigmath &版本。
(As巴特说,它还确保了对象是一个“合适的对象”,这也不会造成伤害--但对我来说,上面的论点更有力)。
我也许应该补充一点你为你的对象选择的构造函数实际上取决于这个类做什么和表示什么。有些对象的复制绝对不是“好”的,还有一些其他的情况,比如bigmath类,复制构造函数绝对是一个好东西。对于bigmath类,你可能还需要一个接受长整数的构造函数,一个双精度型和一个字符串,在某些情况下,有一个引用是没有意义的,在某些情况下,有一个常量引用是没有意义的,在某些情况下,就像我说的,有一个复制构造函数是没有意义的。
通常,你可以通过添加一个*ptr的解引用操作来将指针ptr转换为引用。(这样它就可以传递引用),它不会添加任何额外的代码来使用它。但是为了方便起见,如果你有一个类,你经常有指针指向它,并且你想复制它,那么构造函数接受指针可能是有意义的,我不确定它在哪里,在我的头顶上。

ruarlubt

ruarlubt4#

复制构造函数是你需要执行对象的深度复制或浅度复制的地方,因此我们需要传递要复制的值的引用,它作为一个故障安全机制来避免垃圾值或nullptr,以创建所请求对象的副本。当你在参数中使用指针时,它就变成了一个普通的构造函数。
有关这方面的更多详细信息,请参阅article

hfwmuf9z

hfwmuf9z5#

根据我的复制构造函数的标准使用引用,但引用和指针都将给予相同的输出,但每当你将nullptr分配给对象使用引用(TestConstrutor obj 2 = nullptr)它将不允许,但如果你是作为一个指针传递,它将工作,但它会崩溃,因为你不能分配空指针给对象。

  • 测试构造器(const测试构造器和对象)x = obj.x; y = obj.y;//它将调用测试构造器对象1(100,200);测试构造器对象2 =对象1;测试构造器(const测试构造器 *obj)x = obj->x; y = obj->y;//它将调用测试构造器obj 3 = &obj2;
    它将不允许:-测试构造器(常量测试构造器和对象)x = obj.x; y = obj.y;//测试构造器对象2 =空指针;
  • 测试构造器(常量测试构造器&对象)x = obj.x; y = obj.y;测试构造器(常量测试构造器 * 对象)x = obj->x; y = obj->y;//测试构造器对象2 =空指针;

相关问题