始化列表的特性可提高构造函数设计的效率,第14章将更深入地讨论这个主题。
类作用域
第9章介绍了全局(或文件)作用域和局部(或代码块)作用域。可以在全局变量所属文件的任何地
方使用它,而局部变量只能在其所属的代码块中使用。函数名称的作用域也可以是全局的,但不能是局部
的。C++类引入了一种新的作用域:类作用域。
在类中定义的名称(如类数据成员名和类成员函数名)的作用域都为整个类,作用城为整个类的名称
只在该类中是已知的,在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不会引起冲突。
例如,Stock类的shares成员不同于JobRide类的shares成员。另外,类作用域意味着不能从外部直接访问
类的成员,公有成员函数也是如此。也就是说,要调用公有成员函数,必须通过对象;
Stock sleeper ("Exclusive Ore", 100, 0.25] | // create object
sleeper.show(];
ahoe [)r
同样,在定义成员函数时,必须使用作用域解析操作符:
void Stock :: update (double price)
10.7
// use object to invoke a momber function
// invalid -- can't call mathod directly
1:
void Ik :: WiewIk[)const
cout << fuss << endl:
// fuss has class scope
// fuss is in scope
J/ ViewIk has class scope
简而言之,在类声明或成员函数定义中,可以使用未修饰的成员名称(未限定的名称),就像scll()调
用set_tot()成员函数时那样。构造函数名称在被调用时,才能被识别,因为它的名称与类名相同,在其他
情况下,使用类成员名时。必须根据上下文使用直接成员操作符(.)、间接成员操作符(->)或作用域解
析操作符( :: )。下面的代码片段演示了如何访问具有类作用域的标识符:
class Ik
privater
int fuss:
poblic:
Ik fint f = 9) |fuss - f: }
void ViewIk()const:
// Ikt:places ViewIk into scope
// fuss in scope within class methods
int maint)
Ik * pik = new Ikr
Ik ee - Ik (8):
ee.ViewIk(]:
pik->ViewIktl:
作用域为整个类的常量
有时候。使符号常量的作用城为整个类很有用。例如。Stock类声明使用字面值30米指定company 数
组的长度。另外,由于常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是个不错
的主意。读者可能以为这样做可行:
class Stock
private:
// constructor in scope because has class name
// class object brings Viewik into soope
// pointer-to-Ik brings Viewlk into scope