为什么编写构造函数被认为是c ++中的好习惯,即使它是由编译器自动提供的? 我没有找到任何解决方案 答案是编译器提供默认构造函数,我们可以生成参数化构造函数??
答案 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::vector
或std::string
成员,而vector
或string
为您的班级可以,则不需要任何关于他们的特别关注,预先C ++ 11或发布它。 (编辑:这是因为他们已经有正确初始化的默认构造函数。)
原始指针?原始指针也应该通过初始化(在C ++ 11中为nullptr
或事先到NULL
),但在大多数情况下,你应该完全避免使用它们。默认情况下,使用std::unique_ptr
或std::shared_ptr
(或来自Boost的任何等效表单,用于C ++ 11之前的代码),并为您处理nullptr
的默认初始化(除了许多其他更大的好处)。
答案 1 :(得分:0)
默认构造函数适用于简单类型初始化。如果您有指针作为成员或需要管理生命周期初始化 - 您还需要编写自己的构造函数。
让我们简单地说:如果你的班级只有int,bool,float,char成员 - 你可能不需要实现特定的构造函数。但如果你有指针 - 那么你必须这样做。