构造函数在C ++中有什么好处?

时间:2011-02-07 08:21:38

标签: c++ constructor

构造函数在创建对象时初始化类的数据成员。

我的问题是,这个初始化过程有什么好处?为什么我们不让每个对象在没有构造函数被调用的情况下确定其初始值?

而且,默认构造函数的好处是什么?最后,它正在做没有,不是吗?

感谢。

5 个答案:

答案 0 :(得分:17)

构造函数让每个对象确定其初始值的方法。在C ++中创建新对象时,最初其所有数据成员都具有完全不确定的值。如果要让对象确定自己的默认值,则需要执行一些代码才能将其字段设置为有意义的值。简而言之,是的,对象应该确定它们的初始值,构造函数是这样做的。它们是自动调用的,因此从客户端的角度来看,不需要显式调用任何初始化例程。构造函数会自动执行此操作。

对于默认构造函数,它可以并且经常在其中包含使其与任何内容完全不同的代码。例如,向量构造函数可以设置指向可以存储元素的小缓冲区的指针,以及将对象的大小记录为零。什么都不做会使指针在内存中随机指向某个位置,并将大小字段设置为垃圾,违反类不变量并使对象无法使用。

答案 1 :(得分:3)

在C ++中,初始化存在差异(因为它主要与C兼容)。

C ++类型(类)可以(应该)提供构造函数来初始化自己。默认构造函数只是提供默认行为。

C类型(int,char)不能有构造函数 - 总是需要手动初始化。

如果实现构造函数,则C类型(int,char等)的所有成员变量都需要显式初始化。否则他们的内容是不确定的。 C ++类型(类)的成员变量将使用其默认构造函数初始化自身。如果这不适合您的情况,请使用带参数的专用非默认构造函数。

默认构造函数是让每个对象确定其初始值的一种方法。只是你需要一个构造函数。

答案 2 :(得分:1)

有些类需要数据才能初始化,他们不能总是为自己确定这些数据。因此,通过构造函数传递参数是一种使初始数据可用的方法。只要考虑一个简单的字符串类,通过它的构造函数创建一个具有初始值的字符串真的很方便。

答案 3 :(得分:1)

意图非常重要,一旦初始化,类对象就“准备好使用”了。使用简单的内置类型,编译器知道如何初始化它们 - 例如0。但是,对于更复杂的类型,特别是涉及继承和参考数据,这变得困难甚至不可能。

C ++需要在创建时初始化引用变量(构造类),这必须在构造函数初始化列表中完成,例如:

class Demo {
private:
    int& refInt;
public:
    //Demo() {} // illegal - will not compile since it does not intiailise refInt
    Demo(int anInt) : refInt(anInt) {} // valid, correctly initialised refInt
};

int main() {
    int a;
    Demo demo(a);

    return 0;
}

注意:在此示例中,您不能拥有默认构造函数,因为您必须初始化 refInt

此外,对于继承的类,构造函数是定义在派生类初始化期间调用基类(或类)中的哪个构造函数的地方。

答案 4 :(得分:1)

  

而且,还有什么好处   默认构造函数?最后,它是   什么都不做,不是吗?

您似乎将默认构造函数与编译器生成的默认构造函数混淆。前者只是可以不带参数调用的任何构造函数,这意味着它根本没有参数,或者所有参数都有默认值。后者是在没有显式声明的构造函数时生成的,并且等效于具有空主体和空初始化列表的显式定义的构造函数(这意味着基类也必须具有默认构造函数)。

现在,即使默认构造函数是编译器生成的或者具有空体,但是说它什么也不做是错误的。它至少做了三件我能记得的事情:

  1. 它调用基类的默认构造函数。
  2. 初始化多态类的vtable指针。
  3. 它调用非POD字段的默认构造函数。
  4. 只有当类没有基类,是非多态的并且只有POD字段时,编译器生成的构造函数才真正没有。但它仍然很重要因为基类需要调用它。