如何用c++编写默认构造函数
How to write a default constructor in c++?
所以我知道在类中编写构造函数后,默认的构造函数就会消失,所以你必须开始初始化每个对象。然而,有没有一种方法可以编写一个默认的构造函数,这样你就不必这么做了?
谢谢。
在C++11 之前
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() {}
};
或在C++11 中
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() = default;
};
您可以编写任意数量的构造函数,但要避免使类的使用变得混乱。
隐式默认构造函数消失。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受具有默认值的参数的构造函数;只是编译器没有为您完成。
没有理由不为类A
编写一个空构造函数,并为每个值取默认值。也许不是最好的主意,但这是可以做到的。
A() {/* empty */}
正如评论中所指出的,如果你使用的是c++11,你也可以使用新的默认关键字来告诉你编译器在使用"默认"时会有什么
A() = default;
class A
{
public:
// Or use A()=default for C++11
A(){}
A(int v):m_value(v){}
private:
int m_value;
};
int main()
{
A a; // Without default ctor ==>> error C2512: 'A' : no appropriate default constructor available
return 0;
}
struct S {
S(int) {} // non-default constructor that suppresses the implicit default constructor
S() = default; // bring the default constructor back
};
请注意,有两种意义上使用"默认"。有一个默认构造函数,它有一个签名,这样它就可以在"默认构造"中使用。
其次,"默认"是指实现将与编译器为隐式声明的构造函数自动生成的内容相匹配。
通过给构造函数提供默认参数,可以使类默认可构造(第一种意义上的默认)。
struct S {
S(int = 10) {}
};
而= default
用于明确要求默认实现(第二种意义上的默认实现)。
假设您的编译器使用实现= default
,由于多种原因,这通常优于执行S() {}
。类定义中的= default
生成了一个非用户提供的构造函数,该构造函数具有多种效果。
- 用户提供的特殊成员函数从来都不是微不足道的
- 用户提供的构造函数取消了类型作为聚合的资格
- 值初始化包括使用非用户提供的默认构造函数的类型的零初始化
- 对于没有用户提供的默认构造函数的类型,不允许默认初始化const对象
有时,由于这些影响之一,可能需要用户提供的功能。仍然可以通过在类定义之外使用= default
:
struct S {
S();
};
S::S() = default;
上面提供了编译器的默认实现,但仍然算作用户提供的默认构造函数。此外,这可以用于保持ABI的稳定性;稍后,= default
可以替换为另一个定义,而不必重新编译构造S
对象的所有代码,而需要使用内联默认构造函数。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数