C++对于类的非静态const成员的初始化方式

对于类中的常量成员,需要在创建对象时就进行初始化;这里有两种初始化非静态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在类内已经被初始化了;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值