一、嵌套结构与类
在类的声明中声明的结构、类或枚举被称为是嵌套在类中,其作用域为整个类。该声明不会创建数据对象,只是指定了可以在类中使用的类型。
如果声明在私有部分,则只能在这个类中使用被声明的类型。如果声明是在公有部分,则可以从类的外部通过作用域解析运算符使用被声明的类型。
//声明一个队列类Queue
class Queue
{
enum { Q_SIZE = 10}; //设置队列最大长度
private:
public:
Queue(int qs = Q_SIZE);
~Queue();
bool isEmpty() const;
bool isFull() const;
int queueCount() const;
bool enqueue(const Item &item); //入队列
bool dequeue(Item & item); //出队列
}
//Queue类的实现
class Queue
{
private:
struct Node //类声明内声明的结构
{
Item item;
struct Node * next;
};
enum
{
Q_SIZE = 10
};
Node * front;
Node * rear;
int items;
const int qsize;
public:
...
}
二、成员初始化列表
由逗号分隔的初始化列表组成(前面带冒号),位于参数列表的右括号之后,函数体左括号之前。对于const数据成员,可以进行初始化但是不能进行赋值,所以必须在执行到构造函数体之前,即创建类对象时进行初始化。比如类的数据成员名称为meta,并需要将它初始化为val,则初始化器为 meta(val)。举例如下:
Queue::Queue(int qs): qsize(qs)
{
front =read = NULL;
items = 0;
}
初值可以是常量,或构造函数的参数列表中的参数,且不限于初始化常量。例如,上述举例也可以写成:
Queue::Queue(int qs): qsize(qs),front(NULL), rear(NULL), items(0)
{
}
只有构造函数可以使用这种初始化列表语法(不能将成员初始化列表语法用于构造函数之外的其他类方法),其中对于const数据成员,必须使用这种语法,另外对于被声明为引用的类成员,也必须使用这种语法。示例如下:
class Agency{...};
class Agent
{
private:
Agency & belong;
...
};
Agent::Agent(Agency & a ): belong(a)
{
....
}
这里是因为引用与const数据类似,只能在被创建时初始化,无法进行赋值。对于简单数据成员,使用成员初始化列表与在函数体中使用赋值没什么区别,但是对于本身就是类对象的成员来说,使用成员初始化列表的效率更高。