为什么写构造函数很好

Why writing Constructors is good?

本文关键字:很好 构造函数 为什么      更新时间:2023-10-16

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

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

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

请注意,原始("内置")类型(例如int, double,任何原始指针)通常具有没有默认初始化,因此在没有任何用户定义初始化的情况下留下包含任何这些类型的类是坏事,新构造的对象将包含未知值的成员("垃圾";

对于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;
};

(在实际生活中,您可能不想要默认构造的坐标,而只想要非默认构造函数,因此用户必须提供带有有意义值的参数。)

对于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(或c++ 11之前版本的Boost中的任何等效形式),默认初始化nullptr将为您处理(除了许多其他更大的好处)。

默认构造函数适合于简单类型初始化。如果你有指针作为成员,或者需要管理生命周期初始化,无论如何你都需要编写自己的构造函数。

让我们简单地说:如果你的类只有int、bool、float、char成员——你可能不需要实现特定的构造函数。但是如果你有指针,你就必须。