澄清了C++中的初始化

clarification of initialization in C++

本文关键字:初始化 C++      更新时间:2023-10-16

我在以下示例中真的很困惑:

#include <iostream>
class C {
    public:
    int a,b;
};
int main() {
    C c{3,6};
    std::cout<<c.a<<'n';
    std::cout<<c.b<<'n';
    return 0;
}

它工作正常并给出预期的结果。但是如果我像下面这样修改上面的代码。

#include <iostream>
class C {
    int a,b;
    public:
        int get_a(){
            return a;
        }
        int get_b(){
            return b;
        }
};
int main(){
    C c{3,6};
    std::cout<<c.get_a()<<'n';
    std::cout<<c.get_b()<<'n';
    return 0;
}

在上面的程序中编译器显示了多个错误。为什么第一个程序允许统一初始化,而第二个程序不允许统一初始化?我错在哪里?

默认情况下,c ++ class成员是private的,所以不指定你得到一个私有变量。因为您将类型设为私有,所以您不再免费获得聚合初始化,因此您需要为此类编写自己的构造函数:

class C{
    C(int _a, int _b):
    a(_a), b(_b)
    {}
};

您只需要修复cout的命名空间,您的代码应该可以正常编译:http://coliru.stacked-crooked.com/a/1d69f4f141d2bcd2

从标准:

[dcl.init.aggr] 聚合是一个数组或类,没有用户提供的构造函数,没有非静态数据成员的大括号或等于初始值设定项,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数

在第一个代码中,您只有公共变量,因此代码有效,因为您有一个聚合,使变量私有是导致问题的原因,因为根据上述定义,它不再是聚合。

ab在第二个示例中private,因此无法从类外部访问。

您需要像第一个示例一样将行int a,b;移动到public:范围内。

你还需要std::cout

#include <iostream>
class C {
    public:
        int a,b;     //Make public
        int get_a(){
            return a;
        }
        int get_b(){
            return b;
        }
};
int main(){
    C c{3,6};
    std::cout<<c.get_a()<<'n';   //use namespace std::
    std::cout<<c.get_b()<<'n';   //use namespace std::
    return 0;
}

在代码的修改版本中,您移动了public:标签,以便ab数据成员不再公开。因此,不能从类外部引用它们,即使不能由初始值设定项列表隐式引用。

第一个代码之所以有效,是因为数据成员ab是公共的,因此可以从类外部访问它们。但是,在第二个代码中,它们被声明为私有的,因此无法从类外部访问它们。再次将它们声明为公共,或使用构造函数,如下所示(如果您仍希望它们为私有):

 C(int x,int y)   // This is a parameterised constructor
    {
        a=x;
        b=y;
    }

并将它们初始化为C c(3,6);