我知道c++中复制构造函数的一般语法可以作为参考。但是,我的疑问是,如果我们使用指针类型而不是引用会发生什么?为什么我们不在复制构造函数中使用指针传递机制呢?它的主要缺点是什么?
发布于 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++中实例化文件流的唯一方法:
explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);发布于 2015-01-12 17:08:02
通过引用传递确保将实际对象传递给复制构造函数,而指针可以具有空值,从而使构造函数失败。
发布于 2015-01-12 17:09:59
从技术上讲,您可以编写一个接受指针的构造函数(尽管从技术上讲,根据规范的措辞,它在这种情况下不是一个复制构造函数)。但是,这会阻止您使用不可寻址的结果。假设我们有一个很大的数学类(multiprecision):
bigmath a = 14;
bigmath answer(a * 3);您不能接受表达式a * 3的地址,因此您仍然需要该对象的const bigmath &版本。
(正如Bart所说,它还确保了对象是一个“合适的对象”,这也不会有什么坏处--但对我来说,上面的论点更有说服力)。
也许我应该补充一点,您为对象选择的构造函数的类型实际上取决于类做什么和表示什么。在某些对象中,复制肯定不是“好的”,而在其他情况下,比如bigmath类,复制构造函数绝对是一件好事。对于bigmath类,您可能还需要一个接受长整型、双精度型和字符串的构造函数。在某些情况下,引用是没有意义的。在某些情况下,拥有const引用是没有意义的。在某些情况下,就像我说过的,拥有一个拷贝构造函数是没有意义的。
通常,您可以通过添加取消引用*ptr操作将指针ptr转换为引用。由于编译器将获取该地址(以便它可以传递引用),因此它不会添加任何额外的代码来使用该地址。但是为了方便起见,如果您有一个经常有指针的类,并且您想要复制它,那么使用一个接受指针的构造函数确实是有意义的。我不完全确定那是在哪里,在我的头顶上。
https://stackoverflow.com/questions/27898315
复制相似问题