为什么使用构造函数而不是函数?

时间:2012-03-17 18:03:26

标签: c++ function constructor

这是一个非常基本的问题,我搜索了它,但我只想问这个社区我们有constructorsmethods。但通常我们使用构造函数来初始化变量而不是方法。我认为两者都可以用来初始化变量。那么两者之间的基本区别是什么。有什么可靠的理由吗? 这是一个非常基本的问题,所以请为初学者级别考虑。 提前谢谢..

6 个答案:

答案 0 :(得分:6)

最重要的区别:当你实例化一个对象时,它的构造函数将被调用,而调用一个方法总是可选的。因此,您可能忘记调用初始化方法,并且无法正确初始化所有内容。

例如,实例化对象的所有这些常规方法都将调用构造函数

Foo* p = new Foo();
Foo p;

或者,如果您有必需的参数,请不要定义默认构造函数,而是需要使用参数构造:

class Foo
{
private:
   Foo();
public:
   Foo(int param1, double param2)
};

这样做的好处是在你实例化类之前需要参数。所以你被迫做了:

Foo* p = new Foo(1, 5.0);

并且无法使用有效参数构造成为编译器错误:

Foo* p = new Foo(); // compiler error

所以只要有可能,总是错误地在构造函数中进行初始化。在某些情况下,构造函数可能不可行。例如,构造函数失败的唯一方法是使用异常。构建失败可能是“例行的”,而不是真正特殊的。在某些体系结构上,异常也可能是昂贵的。另一种情况可能是您希望确保虚拟方法完全绑定,只有在构造之后才能保证为真。

答案 1 :(得分:3)

它们不能同时用于初始化成员变量。初始化成员是构造函数的工作,每当您创建新实例时都会自动调用它。

请考虑以下事项:

class Foo {
public:
    // Constructor
    Foo() : x(53)   // Initialise x
    {}

    void bar() {
        x = 42;     // Error, attempt to *assign* a const member!
    }

private:
    const int x;
};

如果没有构造函数,就无法初始化成员x

答案 2 :(得分:1)

自动调用构造函数,因此无需担心用户是否已调用初始化方法。但是,Google style guide does have something to say about constructors

  • 构造函数没有简单的方法来表示错误,没有使用异常。
  • 如果工作失败,我们现在有一个初始化代码失败的对象,因此它可能是一个不确定的状态。
  • 如果工作调用虚函数,则不会将这些调用分派到子类实现。即使你的类目前没有被子类化,你的类的未来修改也可以悄悄地引入这个问题,导致很多混乱。
  • 如果有人创建了这种类型的全局变量,那么构造函数代码将在main()之前调用,可能会破坏构造函数代码中的一些隐式假设。

Google的建议是在构造函数中直接启动,并在单独的方法中启动非平凡的启动。

答案 3 :(得分:0)

与函数不同,在创建对象时会自动调用构造函数。此外,构造函数用于指示用于初始化对象的意图。

答案 4 :(得分:0)

想象一下,你有一个没有空构造函数的成员变量。然后你没有其他选择,只能在构造函数的初始化列表中初始化它。

当您使用new运算符分配数组时,也会调用构造函数,而使用方法初始化会使代码更复杂。

一般来说构造函数中的复杂逻辑并不是一个好主意,但应该在那里进行简单的初始化(确保对象处于某种有效状态需要做的事情)。

答案 5 :(得分:0)

初始化变量无疑是一项非常重要的编程实践。使用类时,选项是在方法内初始化它们。因此,我们有两个步骤: -

  1. 定义方法
  2. 调用方法执行初始化
  3. 但如果忘记'调用方法',变量最终会有垃圾值。为了让程序员的生活更轻松,引入了构造函数方法的概念。

    使用构造函数,我们只需要一步: -

    1. 定义构造函数

    只要创建了类的新Object,就会自动执行'调用部分'。