为什么写作构造函数好?

时间:2016-08-12 12:16:28

标签: c++

为什么编写构造函数被认为是c ++中的好习惯,即使它是由编译器自动提供的? 我没有找到任何解决方案 答案是编译器提供默认构造函数,我们可以生成参数化构造函数??

2 个答案:

答案 0 :(得分:1)

构造函数是将对象初始化为有效状态的方法,建立其他成员函数使用(并保留)的不变量。

如果类的所有数据成员都具有合理的默认值(并且此默认值符合类需要),则编译器生成的默认构造函数可以足够好(并且可以说比用户提供的更好)。

请注意,原语(“内置”)类型(例如int,double,任何原始指针)通常具有 no 默认初始化,因此留下包含任何没有任何用户的类的类 - 定义的初始化是Bad Thing,新构造的对象将包含具有未知值的成员(“垃圾”;标准术语中的“不确定值”)。

对于C ++ 11(或更高版本)代码,通常首选提供默认值以在类定义本身中初始化此类成员,除非有充分的理由不这样做。这样,您就不会忘记在任何构造函数中初始化这样的成员,它们都有默认值。

例如:

class Coordinate
{
public:
    Coordinate() = default; // If you have other constructors and want the default one too
    // ... a few useful members ...

private:
    int m_x = 0;
    int m_y = 0;
};

(在现实生活中,您可能不希望使用默认构造的Coordinate,并且只想使用非默认构造函数,因此用户必须提供具有有意义值的参数。)

对于pre-C ++ 11代码(如果你必须支持一些较旧的编译器,希望是好的,理由),你必须自己为这个例子编写一个默认的构造函数:

class Coordinate
{
public:
    Coordinate() : m_x(0), m_y(0) {}

    // ... a few useful members ...

private:
    int m_x;
    int m_y;
};

另一方面,如果您有std::vectorstd::string成员,而vectorstring为您的班级可以,则不需要任何关于他们的特别关注,预先C ++ 11或发布它。 (编辑:这是因为他们已经有正确初始化的默认构造函数。)

原始指针?原始指针也应该通过初始化(在C ++ 11中为nullptr或事先到NULL),但在大多数情况下,你应该完全避免使用它们。默认情况下,使用std::unique_ptrstd::shared_ptr(或来自Boost的任何等效表单,用于C ++ 11之前的代码),并为您处理nullptr的默认初始化(除了许多其他更大的好处)。

答案 1 :(得分:0)

默认构造函数适用于简单类型初始化。如果您有指针作为成员或需要管理生命周期初始化 - 您还需要编写自己的构造函数。

让我们简单地说:如果你的班级只有int,bool,float,char成员 - 你可能不需要实现特定的构造函数。但如果你有指针 - 那么你必须这样做。