在类中创建类的实例(C++)

Ini*_*nit 4 c++ class

假设我有两个类: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:语法错误:'常量'

Fre*_*son 6

class Circle {
    Box b;

public:
    Circle() : b(0, 0)
    {
        printf("I'm a circle.");
    }
};
Run Code Online (Sandbox Code Playgroud)


Mar*_*y B 5

不允许在类声明中实例化成员变量。推理是在无论如何构造项目之前不应使用成员变量,因此必须在构造函数中实例化它们。

从分号到构造函数的左大括号 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)