【问题标题】:Parameter choice for copy constructor复制构造函数的参数选择
【发布时间】:2009-09-19 06:18:44
【问题描述】:

我最近在一次采访中被问及复制构造函数的参数。
[已编辑] 作为实现复制构造函数功能的 C++ 语言的设计者,为什么要选择常量引用参数而不是指向 const 对象的 const 指针。

我有一些想法,比如可以将指针分配给 NULL,这在复制构造函数中可能没有意义(语义上)以及指针变量是一个独立对象的事实(这在术语上可能不好效率),而引用只是实际对象的别名(因此是传递对象的更好方法)。
还有其他想法吗?

【问题讨论】:

  • 刚刚获得了见解。因为在复制构造函数中,我们需要原始对象是不可变的,为此我们使用 const 引用。但是,如果复制构造函数使用 const 指针指向 const 对象格式,则对象的用户首先需要声明一个独立对象(指向 const 的 const 指针),然后用对象的地址对其进行初始化我们需要一个副本,然后使用复制构造函数(足以让他/她皱眉),因为在 c++ 中不允许将 const 指针临时作为参数。有意义吗?

标签: c++ pointers reference copy-constructor


【解决方案1】:

因为 Stroustrup 希望类像原始类型一样。当你初始化一个int 变量时:

int x = 5;
int y = x; // Why would you write int y = &x; ?

将常量指针传递给常量对象,与 C++ 给 C 带来的不一致。C++ 中的类只是用户定义的类型,如果它们不像原始类型那样工作,那么它们是什么?

另一个在没有引用的情况下用 C++ 编程会很痛苦的例子是运算符重载。想象一下你必须写:

myclass myobj1, myobj2, myobj3;
&myobj3 = &myobj1 + &myobj2;

【讨论】:

    【解决方案2】:

    这是一种语法上的便利。

    调用复制构造函数最常见的用例是当参数按值传递或按值返回时。

    如果复制构造函数的参数是指针而不是引用,则需要应用地址运算符才能调用复制构造函数,这会很尴尬。

    【讨论】:

      【解决方案3】:

      我认为不在复制构造函数中使用指针的重要原因是临时对象如何绑定到右值。对于指针,可以将指针保存为临时指针并在以后以未定义的行为使用它,使用引用更难存储和使用引用,更容易使用实际值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多