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::couta
和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)
{}
};