避免在类构造函数中复制复杂数据

时间:2016-11-05 22:49:02

标签: c++ oop reference

假设我有一个类,其中一个成员变量是另一个复杂的类。我想避免创建这个复杂类的副本,我只想在我的课堂上使用它。那么组织MyClass的最佳方式是什么?

目前我有这样的事情:

class MyClass  
{
public:
    MyClass(const ComplexClass& complex_class)
    : m_class(complex_class) {}

private:
     const ComplexClass& m_class;  // What is the best practice here?
};

我可以这样做吗?或者m_class应该是一个指针?或者在这种情况下你会做什么?

2 个答案:

答案 0 :(得分:0)

如果可以保证传递的引用在对象生存期内有效,那么这个解决方案就足够了。

如果不是,我会建议使用一些智能指针,例如shared_ptr将延长传递数据的生命周期。

(注意,您不仅需要重新组织您的类,还需要重新声明complex_class对象)

答案 1 :(得分:0)

初始化列表仅允许初始化,因此语法:m_class(complex_class)将不起作用。初始化列表将调用构造函数而不是复制构造函数。所以我不确定建议的代码是否会编译。

您可以选择初始化成员变量,方法是获取m_class的构造函数所采用的输入。 const用法有助于在对象的生命周期期间不更改成员变量的值,但是可以始终创建对象的副本,这可能很昂贵。如果目的是避免使用昂贵的副本,那么您希望将复制构造函数和赋值运算符设置为私有。