关于c++的一个封闭类的问题 ?

为什么要在 Car 的无参构造函数中 调用 CTyre(); ????
就算不写 CTyre(); , 程序也是会默认调用 CTyre 类的无参构造函数的啊 !!!

阅读 1.1k
avatarAI BotBETA

在C++中,当你在类的构造函数中显式调用另一个类的构造函数(如在你给出的Car类构造函数中调用CTyre的构造函数),这通常是为了进行成员对象的初始化。然而,从你给出的代码片段和问题的描述来看,似乎存在一些误解。

首先,让我们澄清几个关键点:

  1. 成员对象的初始化:如果你的类(如Car)包含一个其他类的对象(如CTyre)作为成员,那么这个成员对象需要被初始化。这可以通过初始化列表在类的构造函数中进行,或者如果该成员对象有默认构造函数,则会自动调用默认构造函数进行初始化。
  2. 构造函数中显式调用:在你的Car类构造函数中显式调用CTyre()(假设这是CTyre的默认构造函数),实际上是在进行所谓的“值初始化”。但这里有一个重要的点:如果CTyreCar类的成员对象,并且你希望使用CTyre的默认构造函数来初始化它,你实际上应该在初始化列表中这样做,而不是在构造函数体内部。
  3. 构造函数体内的调用:在构造函数体内调用CTyre();实际上是在局部作用域中创建了一个临时的CTyre对象,这个对象在语句执行完毕后会被销毁,并不会影响Car类中作为成员的CTyre对象。

针对你的问题:“为什么要在Car的无参构造函数中调用CTyre(); ???? 就算不写CTyre(); ,程序也是会默认调用CTyre类的无参构造函数的啊 !!!”,这里的关键是理解成员对象的初始化和构造函数体内代码执行的区别。

正确的做法是,如果你想要在Car的构造函数中初始化CTyre成员对象,你应该在初始化列表中这样做:

class Car {
private:
    CTyre tyre; // 成员对象

public:
    Car() : tyre() { // 使用初始化列表调用CTyre的默认构造函数
        // 构造函数体中的代码
    }

    // 其他成员函数...
};

在这个例子中,: tyre()就是初始化列表,它确保CTyre的默认构造函数被用来初始化Car类中的tyre成员对象。如果你不在初始化列表中显式调用CTyre的构造函数(且没有提供其他初始化方式),编译器也会自动调用CTyre的默认构造函数(如果存在的话)。然而,显式地在初始化列表中调用它可以使代码的意图更加清晰。

综上所述,你的理解中关于“程序会默认调用CTyre类的无参构造函数”是正确的,但关键在于理解如何正确地在类的构造函数中初始化成员对象。

1 个回答

当你定义了一个类成员(如CTyre tyre),如果没有在初始化列表中显式地初始化它,编译器会自动调用该成员的默认构造函数。所以你说的调用的确是多余的,但是这行代码是否存在都不影响程序的正常运行。

或者这一本书不那么严谨

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏