当前位置: 首页 > 知识库问答 >
问题:

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

昝欣可
2024-10-03

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

共有2个答案

凌展
2024-10-03

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

或者这一本书不那么严谨

宇文俊风
2024-10-03

在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类的无参构造函数”是正确的,但关键在于理解如何正确地在类的构造函数中初始化成员对象。

 类似资料:
  • 下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 刚开始学习java大约一个月,我对arraylist和oop有几个问题 这个arraylist允许我将字符串添加到列表中并存储它,但是如果我有一个类调用簿呢 这三者有什么区别?假设我有大量的输入,比如文件 我有一个班级运动 我该怎么做呢?所以我用许多参数来添加这些输入,因为如果我想添加,我通常会这样做 我也会去

  • 我想实现一个hashmap,但是当我测试时,直接运行和调试运行的结果不一致 下面是我的代码 这是我的直接运行时的结果 当我在没有断点的情况下调试和运行时,结果同上。但当我踏过它,结果如下 谁能告诉我为什么???

  • 想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。 我有A和B两个班: 正如您在类B中看到的,我有一个方法登录名,我在其中放入了两个变量。我想访问类A中这些变量的值。我怎么做? PS:我正在使用JAVA8,我是个新手。

  • 考虑类<代码> OuterClass < />代码> <代码> InnerClass < /代码> 第二个类,它试图扩展

  • 上面是代码,想执行'person1.func3()'。 结果如下图