为什么写构造函数很好
Why writing Constructors is good?
为什么编写构造函数被认为是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::vector
或std::string
作为成员,并且空vector
或string
对于你的类是可以的,你不需要特别关心它们,在c++ 11之前或发布它。(编辑:这是因为他们已经有默认的构造函数做正确的初始化。)
和原始指针?原始指针也应该初始化(c++ 11中的nullptr
或之前的NULL
),但在大多数情况下,您应该完全避免使用它们。默认使用std::unique_ptr
或std::shared_ptr
(或c++ 11之前版本的Boost中的任何等效形式),默认初始化nullptr
将为您处理(除了许多其他更大的好处)。
默认构造函数适合于简单类型初始化。如果你有指针作为成员,或者需要管理生命周期初始化,无论如何你都需要编写自己的构造函数。
让我们简单地说:如果你的类只有int、bool、float、char成员——你可能不需要实现特定的构造函数。但是如果你有指针,你就必须。
- 初始化具有非默认构造函数的std::数组项的更好方法
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 使用构造函数初始化结构还是在之后设置其值更好?
- enable_if is_same constexpr函数使MSVC失败(但在Clang,GCC中效果很好)
- 在构造函数中组织初始值设定项列表的更好方法
- 错误:没有匹配的成员函数调用 'upper_bound' =>仅在 macOS 上 => Windows 和 Linux 都很好
- 哪种 c++ 构造函数样式更好
- Curly Braces构造函数更喜欢initializer_list而不是更好的匹配.为什么
- 即使阵列腐烂到指针,如何将函数的参数保留为数组,这很好
- 是复制构造函数中初始值设定项列表中的make_unique不使用noexcept说明符的好用途
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 是否将std矢量重新分配到默认的构造函数向量是擦除的好方法
- 在构造函数中循环C++是一个好主意吗?
- 对于复制构造函数来说很重要
- C++选项定价函数..单独工作很好,但对于股票价格的范围(向量)来说不行
- 一个很好的向量散列函数
- 在类构造函数中将此指针传递给CreateThread在线程过程中的行为很奇怪
- 在析构函数中调用函数是一种很好的做法
- 为什么写构造函数很好