C++ C+中初始化的说明+;

C++ C+中初始化的说明+;,c++,initialization,uniform-initialization,C++,Initialization,Uniform Initialization,下面的例子让我很困惑: #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; } #包括 C类{ 公众: INTA,b; }; int main(){ C{3,6}; std::couta和

下面的例子让我很困惑:

#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;
}
#包括
C类{
公众:
INTA,b;
};
int main(){
C{3,6};

std::cout
a
b
在您的第二个示例中是
私有的
,因此从类外无法访问。

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

您还需要在
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;
}
#包括
C类{
公众:
int a,b;//公开
int get_a(){
返回a;
}
int get_b(){
返回b;
}
};
int main(){
C{3,6};

std::cout在代码的修改版本中,您移动了
public:
标签,因此
a
b
数据成员不再是公共的。因此,它们不能从类外引用,甚至不能通过初始值设定项列表隐式引用。

第一个代码起作用,因为数据成员
a
b
是公共的,因此可以从类外部访问它们。但是,在第二个代码中,它们被声明为私有的,因此不能从类外部访问它们。请再次将它们声明为公共的,或者按照如下方式使用构造函数(如果您仍然希望它们为私有的话):


<默认> C++ > <强> >代码>类< /代码> <强> >成员是“代码>私下<代码>,因此不指定私有变量。因为您将这些类型私有化,所以不再获得免费的聚合初始化,因此您需要为该类编写自己的构造函数:

class C{
    C(int _a, int _b):
    a(_a), b(_b)
    {}
};
您只需要修复
cout
的名称空间,您的代码应该可以很好地编译:

根据标准:

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


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

在第二种情况下,类成员变量是
私有的
(隐式),无法直接初始化。通常情况下:错误应该表示出了什么问题…显示它们通常很有用。但特别是-您将数据成员从公共更改为私有。@Mat:如果我添加了参数化的ctor,则效果很好。编译器抱怨调用“C::C()时没有匹配的函数“请注意,您仍然可以使用此构造函数的
C{3,6}
语法。@shuttle87:给我一个错误:
error:在C++98中,“C”必须由构造函数初始化,而不是由“{…}”
初始化。在C++98中,您确实需要使用
C(3,6)
syntax,在更高版本的c++0x和更高版本中,首选的方法是使用统一的初始化语法。根据编译器/版本的不同,这可能需要允许使用编译器标志。@shuttle87:噢!感谢您提供的信息。
 C(int x,int y)   // This is a parameterised constructor
    {
        a=x;
        b=y;
    }
class C{
    C(int _a, int _b):
    a(_a), b(_b)
    {}
};