假设我有两个类:Box,Circle。
class Box{
int x, y;
...Box(int xcoord, int ycoord){printf("I'm a box."); x = xcoord; y = ycoord;}
};
class Circle{
...Circle(){printf("I'm a circle.");}
};
但是让我们说在Circle类中,我想创建一个Box类的实例。 我试过这个:
class Circle{
Box b(0,0);
...Circle(){printf("I'm a circle.");}
};
我收到错误:
错误C2059:语法错误:'常量'
答案 0 :(得分:5)
class Circle {
Box b;
public:
Circle() : b(0, 0)
{
printf("I'm a circle.");
}
};
答案 1 :(得分:4)
不允许在类声明中实例化成员变量。理由是在构造项目之前不应使用成员变量,因此必须在构造函数中实例化它们。
从分号到构造函数左括号的代码,Box():x(0),y(0) {}称为初始化列表,用于初始化变量调用构造函数块中的代码之前的默认值。如果变量未在此列表中初始化,则C ++将调用无参数构造函数来初始化它们(或者在内置数据类型的情况下,不执行任何操作)。您没有为Box类指定无参数构造函数,因此它在圆类中保持未初始化,从而导致错误。有两种明显的方法可以解决这个问题,或者为Box定义一个无参构造函数,或者在圆形构造函数的初始化列表中初始化Box成员变量。第二种方法总是首选。
在构造函数中使用初始化列表是一个很好的习惯。如果你等待在构造函数的代码块中初始化大对象,那么在进入代码块之前首先调用对象无参数构造函数然后再次调用构造函数将变量初始化为你想要的状态。
class Box {
public:
int x,y;
Box(int xcoord, int ycoord){printf("I'm a box."); x = xcoord; y = ycoord;}
// Box() : x(0), y(0) {} Can do this, not advised.
};
class Circle{
Box b;
Circle() : b(0,0) {printf("I'm a circle.");}
};