为什么要在 Car 的无参构造函数中 调用 CTyre(); ????
就算不写 CTyre(); , 程序也是会默认调用 CTyre 类的无参构造函数的啊 !!!
为什么要在 Car 的无参构造函数中 调用 CTyre(); ????
就算不写 CTyre(); , 程序也是会默认调用 CTyre 类的无参构造函数的啊 !!!
在C++中,当你在类的构造函数中显式调用另一个类的构造函数(如在你给出的Car
类构造函数中调用CTyre
的构造函数),这通常是为了进行成员对象的初始化。然而,从你给出的代码片段和问题的描述来看,似乎存在一些误解。
首先,让我们澄清几个关键点:
Car
)包含一个其他类的对象(如CTyre
)作为成员,那么这个成员对象需要被初始化。这可以通过初始化列表在类的构造函数中进行,或者如果该成员对象有默认构造函数,则会自动调用默认构造函数进行初始化。Car
类构造函数中显式调用CTyre()
(假设这是CTyre
的默认构造函数),实际上是在进行所谓的“值初始化”。但这里有一个重要的点:如果CTyre
是Car
类的成员对象,并且你希望使用CTyre
的默认构造函数来初始化它,你实际上应该在初始化列表中这样做,而不是在构造函数体内部。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
类的无参构造函数”是正确的,但关键在于理解如何正确地在类的构造函数中初始化成员对象。
2 回答1.4k 阅读✓ 已解决
2 回答2.6k 阅读
2 回答813 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
1 回答910 阅读✓ 已解决
2 回答950 阅读
当你定义了一个类成员(如
CTyre tyre
),如果没有在初始化列表中显式地初始化它,编译器会自动调用该成员的默认构造函数。所以你说的调用的确是多余的,但是这行代码是否存在都不影响程序的正常运行。或者这一本书不那么严谨