对于类中的常量成员,需要在创建对象时就进行初始化;这里有两种初始化非静态const成员的方式:
1.类内初始化;
2.构造函数中的初始化列表语法;
一.初始化列表语法:
C++的构造函数对对象赋值的流程是现在内存中分配空间,然后在调用构造函数对对象进行初始化,常量成员必须在分配空间时就进行初始化,C++提供了初始化列表的方式,对常量成员进行初始化;位于参数列表右括号之后,函数体左括号之前,用:和,分隔,如果数据成员的名称是mdata,并需要将其初始化为val,则初始化器为mdata(val).
#ifndef QUEUE_H_
#define QUEUE_H_
class Queue
{
enum{Q_SIZE = 10};
private:
struct NodeP { Item item; struct Node* next; };
Node* front;
Node* rear;
int items;
const int qsize;//常量必须在分配空间时就进行初始化赋值,
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);
};
#endif
Queue::Queue (int qs):qsize(qs)
{
... ...
}
//初始化列表不局限于初始化常量,
//数据成员初始化的顺序与类中声明的顺序相同,与列表内排列的顺序无关;
Queue::Queue(int qs) :qsize(qs),front(NULL),rear(NULL),items(0)
{
}
限制:只有构造函数可以使用这种初始化列表的语法,对于const 成员必须使用这种语法,对于被声明为引用的类成员也必须使用这种语法;C++认为对于本身就是类类型的成员来说,初始化列表的形式效率更高,对于内置类型则没什么区别;
class Agency{... ...};
class Agent{
private:
Agency&belong;//声明为引用,必须在分配空间时就确定值;和const一样,是顶层const;
};
Agent::Agent(Agency&a):belong(a)//引用类成员,必须使用初始化列表进行初始化;
{
... ...
}
//同时也只有构造函数由初始化列表这一语法形式;
C++类成员初始化的方式:
至此我们可以看到对于非静态const成员(const,引用类型)必须使用初始化列表的形式初始化;
对于静态成员,则要在类外进行初始化;
初始化列表的语法形式可以用于常规初始化;
//成员初始化列表使用的括号方式也可以用于常规初始化,意思如下:
int games=12;
double talk=2.71828;
替换为:
int games(12);
double talk(2.71828);
二.类内初始化
class Classy
{
int mem1=10; //类内初始化
const int mem2=20; //类内初始化
};
这与在构造函数中使用成员初始化列表等价:
Classy::Classy(int n):mem1(10),mem2(20){}
Classy::Classy(int n):mem1(10){}//这里mem2在类内已经被初始化了;