首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们不能在c++的复制构造函数中使用指针传递?

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

Stack Overflow用户
提问于 2015-01-12 16:59:48
回答 4查看 9.1K关注 0票数 3

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

EN

回答 4

Stack Overflow用户

发布于 2015-01-12 17:11:30

根据标准,不存在带指针的复制构造函数:

[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++中实例化文件流的唯一方法:

代码语言:javascript
复制
 explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
票数 7
EN

Stack Overflow用户

发布于 2015-01-12 17:08:02

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

票数 6
EN

Stack Overflow用户

发布于 2015-01-12 17:09:59

从技术上讲,您可以编写一个接受指针的构造函数(尽管从技术上讲,根据规范的措辞,它在这种情况下不是一个复制构造函数)。但是,这会阻止您使用不可寻址的结果。假设我们有一个很大的数学类(multiprecision):

代码语言:javascript
复制
bigmath a = 14;

bigmath answer(a * 3);

您不能接受表达式a * 3的地址,因此您仍然需要该对象的const bigmath &版本。

(正如Bart所说,它还确保了对象是一个“合适的对象”,这也不会有什么坏处--但对我来说,上面的论点更有说服力)。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27898315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档