C++ 具有用户定义构造函数的非聚合类的值初始化

C++ 具有用户定义构造函数的非聚合类的值初始化,c++,C++,我要回答这个问题: 当C++中的类对象具有用户定义的默认构造函数时,只有初始化了一些数据成员,其余的数据成员是否被初始化? 以下是我尝试的导致编译错误的程序: #include <iostream> using namespace std; class A { public: A() { i=10; f = 10.0f; c = 45; d = 10.0; } void show() {

我要回答这个问题: 当C++中的类对象具有用户定义的默认构造函数时,只有初始化了一些数据成员,其余的数据成员是否被初始化? 以下是我尝试的导致编译错误的程序:

#include <iostream>
using namespace std;

class A {
public:
    A() {
        i=10;
        f = 10.0f;
        c = 45;
        d = 10.0;
    }

    void show() {
        cout << i << "\t" << f << "\t" << c << "\t" << d<<"\n";
    }

private:
    int i;
    float f;
    char c;
    double d;
};

int main() {
    A a={20,20.0f};
    a.show();
}
#包括
使用名称空间std;
甲级{
公众:
(){
i=10;
f=10.0f;
c=45;
d=10.0;
}
无效显示(){

您必须用4个参数声明构造函数,如

A(int i = 10, float f = 10.0f, int c = 45, float d = 10.0f):
i(i), f(f), c(c), d(d)
{

}

现在,您可以使用大括号初始化a变量,因为您的类具有非静态数据成员,因此不符合聚合条件

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或等效初始值设定项(9.2),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚拟函数(10.3)

编辑:

对于非聚合类的对象,如果只初始化了部分数据成员,那么是否会初始化其余的值(用0赋值)

这些规则规定于:

C++11 8.5.4列表初始化[dcl.init.List]第3段:

类型为T的对象或引用的列表初始化定义如下:
-如果初始值设定项列表中没有元素,并且T是具有默认构造函数的类类型,则对象的值已初始化。
-否则,如果T是聚合,则执行聚合初始化(8.5.1)。
-否则,如果T是std::initializer_list的特化,则按照如下所述构造initializer_list对象,并根据相同类型(8.5)类中对象初始化的规则来初始化该对象。
-否则,如果T是类类型,则会考虑构造函数。将枚举适用的构造函数,并通过重载解析(13.3、13.3.1.7)选择最佳构造函数。如果转换任何参数都需要缩小转换(见下文),则程序的格式不正确。
-否则,如果T是引用类型,则T引用的类型的prvalue临时值将被列表初始化,并将引用绑定到该临时值。[注意:通常,如果引用类型是对非常量类型的左值引用,则绑定将失败,并且程序格式错误。-结束注]
-否则,如果初始值设定项列表只有一个元素,则从该元素初始化对象或引用;如果需要将元素转换为T,则程序的格式不正确。
-否则,如果初始值设定项列表没有元素,则对象值已初始化。
-否则,程序的格式就不正确


您的程序不属于上述任何情况,因此属于格式不正确的情况。

和用户提供的构造函数。是的,我同意,我的疑问是非聚合类的对象如果只有一些数据成员被初始化,其余的值是否会被初始化(分配为0)?@ProgEnthu:更新了答案的细节。您可能希望看到标准的相关部分,因为它显示了更多的代码示例。我只是在这里添加了引号,而不是示例。或者提供了一个采用的构造函数。我不认为当您有多个类型时,可以使用std::initializer\u列表。