问题在于qsize是常量

// not acceptable!

据对象,而只是指定了可以在类中使用的类型。如果声明是在类的私有部分进行的,则只能在这个类使用
被声明的类型;如果声明是在公有部分进行的,则可以从类的外部通过作用域解析操作符使用被声明的类
型。例如,如果Node是在Queue美的公有部分声明的,则可以在类的外面声明Queue :: Node类型的变量。

设计好数据的表示方式后,接下来需要编写类方法。

3. 类方法
类构造函数应提供类成员的值。由于在这个例子中,队列最初是空的,因此队首和队尾指针都设置为
NULL(或0),并将items设置为0。另外,还应将队列的最大长度qsize设置为构造函数参数qs的值。下
面的实现方法无法正常运行:
Queue: :Queue (int qs)

front = rear - NULL:
items = 0:
qsize = qs:

问题在于qsize是常量,所以可以对它进行初始化,但不能给它赋值。从概念上说,调用构造函数时,
对象将在括号中的代码执行之前被创建。因此,调用Queue(int qs)构造函数将导致程序首先给4个成员
变量分配内存。然后,程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。因此,对于const
数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化。C++提供了一种特殊的句法来完成
上述工作,它叫做成员初始化列表(member initializer list)。成员初始化列表由逗号分隔的初始化列表组成
(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前。如果数据成员的名称为mdata,并需
要将它初始化为val,则初始化器为mdata(val)。使用这种表示法,可以这样编写Queue的构造函数:
Queue :: Queue (int qs) ; qsize (qs) // initialize qsize to qs

front = rear = NULL:
items - 0;

通常,初值可以是常量或构造函数的参数列表中的参数。这种方法并不限于初始化常量,可以将Queue
构造函数写成如下所示:
Queue :: Queue (int qs) : qsize (qs) , front (NULL) , rear (NULL) , items (0)

// must use initializer list to initialize

只有

// not acceptable!

据对象,而只是指定了可以在类中使用的类型。如果声明是在类的私有部分进行的,则只能在这个类使用
被声明的类型;如果声明是在公有部分进行的,则可以从类的外部通过作用域解析操作符使用被声明的类
型。例如,如果Node是在Queue美的公有部分声明的,则可以在类的外面声明Queue :: Node类型的变量。

设计好数据的表示方式后,接下来需要编写类方法。

3. 类方法
类构造函数应提供类成员的值。由于在这个例子中,队列最初是空的,因此队首和队尾指针都设置为
NULL(或0),并将items设置为0。另外,还应将队列的最大长度qsize设置为构造函数参数qs的值。下
面的实现方法无法正常运行:
Queue: :Queue (int qs)

front = rear - NULL:
items = 0:
qsize = qs:

问题在于qsize是常量,所以可以对它进行初始化,但不能给它赋值。从概念上说,调用构造函数时,
对象将在括号中的代码执行之前被创建。因此,调用Queue(int qs)构造函数将导致程序首先给4个成员
变量分配内存。然后,程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。因此,对于const
数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化。C++提供了一种特殊的句法来完成
上述工作,它叫做成员初始化列表(member initializer list)。成员初始化列表由逗号分隔的初始化列表组成
(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前。如果数据成员的名称为mdata,并需
要将它初始化为val,则初始化器为mdata(val)。使用这种表示法,可以这样编写Queue的构造函数:
Queue :: Queue (int qs) ; qsize (qs) // initialize qsize to qs

front = rear = NULL:
items - 0;

通常,初值可以是常量或构造函数的参数列表中的参数。这种方法并不限于初始化常量,可以将Queue
构造函数写成如下所示:
Queue :: Queue (int qs) : qsize (qs) , front (NULL) , rear (NULL) , items (0)

// must use initializer list to initialize

只有构造函数可以使用这种初始化列表句法。如上所示,对于const 类成员,必须使用这种句法。另
外,对于被声明为引用的类成员,也必须使用这种句法:
class Agency { ... 1:
class Agent

private:
Agency & belong:

Agent :: Agent (Agency & a) : belong (a) [ ... }
这是因为引用与const数据类似,只能在被创建时进行初始化。对于简单数据成员(例如front和items),
使用成员初始化列表和在函数体中使用赋值没有什么区别。不过,正如第14章将要介绍的,对于本身就是
类对象的成员来说,使用成员初始化列表的效率更高。

成员初始化列表的句法
如果Classy是一个类,而meml、mem2和mem3都是这个奏的数据成员,则类构造函数可以使用如
下的句法来初始化数据成员:
Classy :: Classy (int n. int m) : meml (n) , mem2 (0) , mem3 (n'm + 2)

法。如上所示,对于const 类成员,必须使用这种句法。另
外,对于被声明为引用的类成员,也必须使用这种句法:
class Agency { ... 1:
class Agent

private:
Agency & belong:

Agent :: Agent (Agency & a) : belong (a) [ ... }
这是因为引用与const数据类似,只能在被创建时进行初始化。对于简单数据成员(例如front和items),
使用成员初始化列表和在函数体中使用赋值没有什么区别。不过,正如第14章将要介绍的,对于本身就是
类对象的成员来说,使用成员初始化列表的效率更高。

成员初始化列表的句法
如果Classy是一个类,而meml、mem2和mem3都是这个奏的数据成员,则类构造函数可以使用如
下的句法来初始化数据成员:
Classy :: Classy (int n. int m) : meml (n) , mem2 (0) , mem3 (n'm + 2)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值