所以我知道在类中编写构造函数后,默认构造函数就会消失,所以你必须开始初始化每个对象。但是,有没有办法编写一个默认构造函数,这样您就不必这样做了?
谢谢。
所以我知道在类中编写构造函数后,默认构造函数就会消失,所以你必须开始初始化每个对象。但是,有没有办法编写一个默认构造函数,这样您就不必这样做了?
谢谢。
C++11 之前
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() {}
};
或在 C++11 中
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() = default;
};
您可以编写任意数量的构造函数,但要避免使您的类难以使用。
隐式默认构造函数消失了。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受具有默认值的 args 的构造函数;它只是不是由编译器为你完成的。
没有理由你不能只为一个类编写一个空的构造函数A
并为每个值取默认值。也许不是最好的主意,但可以做到。
A() {/* empty */}
如评论中所述,如果您使用的是 c++11,您还可以使用新的default 关键字来为您提供编译器在执行“默认”时将拥有的内容
A() = default;
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) {}
};
While= default
用于明确要求默认实现(第二种意义上的默认)。
由于多种原因,假设您的编译器= default
使用它通常优于使用它S() {}
。= default
在类定义中产生一个非用户提供的构造函数,它有几个效果。
由于这些影响之一,有时可能需要用户提供的功能。仍然可以= default
在类定义之外使用它:
struct S {
S();
};
S::S() = default;
上面提供了编译器的默认实现,但仍然算作用户提供的默认构造函数。此外,这可用于维持 ABI 稳定性;稍后= default
可以用另一个定义替换,而不必重新编译所有代码构造S
对象,而内联默认构造函数则需要它。
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;
}