C++ 如何在c++;?
所以我知道,在类中编写构造函数后,默认构造函数将消失,因此必须开始初始化每个对象。然而,有没有一种方法可以编写一个默认构造函数,这样您就不必这样做C++ 如何在c++;?,c++,class,object,constructor,C++,Class,Object,Constructor,所以我知道,在类中编写构造函数后,默认构造函数将消失,因此必须开始初始化每个对象。然而,有没有一种方法可以编写一个默认构造函数,这样您就不必这样做 谢谢。隐式默认构造函数消失了。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受带有默认值的参数的构造函数;这不是编译器为你做的 没有理由不能为类a编写一个空构造函数,并为每个值取默认值。也许不是最好的主意,但它是可以做到的 A() {/* empty */} 如注释中所述,如果您使用的是c++11,那么您也可以使用新的来提供编译器在执行
谢谢。隐式默认构造函数消失了。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受带有默认值的参数的构造函数;这不是编译器为你做的 没有理由不能为类
a
编写一个空构造函数,并为每个值取默认值。也许不是最好的主意,但它是可以做到的
A() {/* empty */}
如注释中所述,如果您使用的是c++11,那么您也可以使用新的来提供编译器在执行“默认”时所具有的功能
隐式默认构造函数消失了。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受带有默认值的参数的构造函数;这不是编译器为你做的 没有理由不能为类
a
编写一个空构造函数,并为每个值取默认值。也许不是最好的主意,但它是可以做到的
A() {/* empty */}
如注释中所述,如果您使用的是c++11,那么您也可以使用新的来提供编译器在执行“默认”时所具有的功能
在C++11之前
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() {}
};
或者在C++11中
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() = default;
};
您可以编写任意数量的构造函数,但要避免使类在使用上混淆。在C++11之前
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() {}
};
struct S {
S(int) {} // non-default constructor that suppresses the implicit default constructor
S() = default; // bring the default constructor back
};
或者在C++11中
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() = default;
};
您可以编写任意数量的构造函数,但要避免使您的类难以使用
struct S {
S(int) {} // non-default constructor that suppresses the implicit default constructor
S() = default; // bring the default constructor back
};
请注意,使用“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 = 10) {}
};
而=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;
}
请注意,使用“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 = 10) {}
};
而=default
用于显式地请求默认实现(第二种意义上是默认)
假设您的编译器实现了=default
,使用它通常优于使用S(){}
,原因有很多<代码>=类定义中的默认值生成一个非用户提供的构造函数,该构造函数具有多种效果
- 用户提供的特殊成员函数从来都不是微不足道的
- 用户提供的构造函数取消类型作为聚合的资格
- 值初始化包括使用非用户提供的默认构造函数的类型的零初始化
- 对于没有用户提供的默认构造函数的类型,不允许对常量对象进行默认初始化
=default
:
struct S {
S();
};
S::S() = default;
上面提供了编译器的默认实现,但仍然算作用户提供的默认构造函数。此外,这可用于维持ABI稳定性;稍后,
=default
可以用另一个定义替换,而无需重新编译所有构建S
对象的代码,但是它需要一个内联默认的默认构造函数。=dafault
.@LuchianGrigore*default
我刚才读了什么@卢钦格里戈一定是芝加哥人!学究:如果一个类有任何用户定义的构造函数,编译器将不会生成一个普通的默认构造函数。=dafault
…@LuchianGrigore*default
我刚才读了什么@卢钦格里戈一定是芝加哥人!Pedantry:如果一个类有任何用户定义的构造函数,编译器将不会生成一个普通的默认构造函数。
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;
}