假设我有两个类: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.");}
};
Run Code Online (Sandbox Code Playgroud)
但是,让我们说在Circle类中,我想创建一个Box类的实例.好吧,我试过这个:
class Circle{
Box b(0,0);
...Circle(){printf("I'm a circle.");}
};
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
错误C2059:语法错误:'常量'
class Circle {
Box b;
public:
Circle() : b(0, 0)
{
printf("I'm a circle.");
}
};
Run Code Online (Sandbox Code Playgroud)
不允许在类声明中实例化成员变量。推理是在无论如何构造项目之前不应使用成员变量,因此必须在构造函数中实例化它们。
从分号到构造函数的左大括号 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.");}
};
Run Code Online (Sandbox Code Playgroud)