【问题标题】:C++ Passing Const Object Reference Into ConstructorC ++将常量对象引用传递给构造函数
【发布时间】:2016-02-15 18:32:48
【问题描述】:

我目前正在设计一个将引用另一个对象的数据的类。在这个新类中,我试图传递一个对象引用,以便新类可以查看对象的值,而无需复制对象的原始数据。但是,我正在为此苦苦挣扎。

我目前有以下类原型:

Force2Motion(const RigidBody& rigid_body);

所以当我将此引用传递给构造函数时,我想在对象初始化后保存它以备将来使用。所以我想说点什么

RigidBody _memberObject = rigid_body;

但是,我想避免将所有刚体复制到它自己的对象中。相反,我认为做这样的事情会更合适

// Force2Motion Member Object
RigidBody& _rigidBody;

然后在对象创建期间有以下构造函数

Force2Motion(const RigidBody& rigid_body):
    _rigidBody(rigid_body)

但是,这会引发错误,提示我不允许将引用分配给 const 引用。我想确保这个新类不会重新分配构造函数引用,因此我相信我需要 const。

我确实意识到,如果我将成员对象初始化为 const 引用,它将允许我很好地运行构造函数,但是我不能使用任何对象成员函数,因为编译器认为访问该成员函数可能会改变原始对象引用的数据。

这样我有:

const RigidBody& _rigidBody;

带有构造函数

 Force2Motion(const RigidBody& rigid_body):
      _rigidBody(rigid_body)

是否可以对 RigidBody 类进行更改,以便即使我已将对象声明为 const,我仍然可以使用成员函数?例如,我是否可以标记某些函数,以便它们指示访问它们不会更改对象中的任何数据?

感谢您的帮助!

编辑:在我描述问题的过程中,我意识到我应该问的真正问题。因此,我很容易就能搜索到这个问题。看看这个link。它解释说,如果将对象初始化为 const,则将无法访问该对象的任何成员函数,因为访问成员函数可能会更改定义为 const 的对象中的数据。因此,如果您有一个您知道不会更改对象数据的成员函数,则需要使用 const 关键字标记该函数(具体请参阅链接)。这样做将允许您将对象声明为 const 但仍然可以访问某些成员函数。

【问题讨论】:

    标签: c++ constructor


    【解决方案1】:

    是的,你可以。成员函数可以设为const

    void myFunction() const;
    

    使用这个const 使this 指针变为常量,因此意味着您不能修改成员变量或调用其他非常量成员函数。有一些例外,例如 const_castmutable 关键字。但应该避免这些。

    关于何时使用 const 的一个很好的简单示例是在 getter 上。

    int getSize() const
    {
       return size;
    }
    

    由于什么都不会改变,所以可以在 const 或非 const 对象上调用此函数。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2013-01-03
      • 2013-11-13
      • 2016-04-20
      • 2020-07-22
      • 2017-03-17
      相关资源
      最近更新 更多