0

我正在尝试创建一个包含另一个类作为成员变量的类。我遇到以下问题:

class SubClass{
    ....
};

class MainClass{
   public:
    MainClass(SubClass const & subClass_);
   private:
    SubClass subClass
};

在构造函数的 .cpp 文件中

MainClass::MainClass(SubClass const & subClass_){
   subClass =  subClass_;
}

这会给出编译器错误。但以下工作:

MainClass::MainClass(SubClass const & subClass_):
   subClass(subClass_) {}

谁能告诉我这两者有什么区别?

4

3 回答 3

0
  • 在第一种情况下operator=,它应用于已经创建的类实例(创建类的第一个默认实例,然后调用 operator=)
  • 在第二种情况下,使用成员初始化允许使用复制构造函数来创建类实例,因此最初使用所需的值对其进行初始化。

区别:
第二种情况被认为更有效,因为它执行的操作更少。
第一种情况 - 要求类具有默认构造函数。

您的问题可能是MainClass 没有实现默认构造函数的结果,只要您实现了自己的构造函数版本 - 编译器不再创建特殊成员函数(默认构造函数)

解决方案:实现默认构造函数/使用成员初始化语法(根据您的应用程序逻辑选择变体)

于 2013-10-03T09:59:42.903 回答
0

您不能简单地使用 '=' 来复制对象,除非该运算符“重载”以某种方式克隆对象。不过,这里的 subClass 有一个构造函数,可以将输入对象复制到新的对象中,这就是您可以使用第二个代码的原因。

于 2013-10-03T09:35:05.370 回答
0

这很可能表明 SubClass 不支持赋值运算符(这在您以前的代码中是必需的)。后面的代码不调用赋值,而是从 subClass_ 复制初始化子类成员

一旦你输入了 SubClass 的定义,就可以说更多

于 2013-02-25T02:37:05.140 回答