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