如果该子对象有非默认构造函数,而类中又想初始化这个子对象时,不能直接初始化,要通过列表或者等于号或者初始化列表进行,如下:
class c1
{
public:
c1(){}
c1(int a){}
};
class c2
{
c1 a(2);//报错,编译器认为a是个函数,但是形参没有指定类型
c1 a{2};//正确
c1 a=2;//正确;
c1 a=c1(2);//正确;
c1():a(2)//通过初始化列表进行初始化
{}
};
同理,如果一个类中有容器成员,比如vector,不能直接写
class c
{
vectors(1);//这种会报错;
vectors{1};//正确;
};
为了避免二义性,编译器把这种符号看作函数。所以会报错,因为形参没有指定类型。