关键词所带来的差异

如果不是为了努力维护与C之间的兼容性,C++远可以比现在更简单些。举个例子,如果没有8种整数需要支持的话,overloaded function的解决方式将会简单得多。同样道理,如果C++丢掉C的声明语法,就不需要花脑筋去判断下面这一行其实是pf的一个函数调用操作(invocation)而不是其声明:

 

// 不知道下面是个 declaration 还是 invocation

// 直到看到整数常量 1024 才能决定

int ( *pf )( 1024 );

 

而在下面这个声明中,像上面那样的向前预览(lookahead甚至起不了作用:

 

// meta-language rule :

// pq 的一个 declaration,而不是 invocation

int ( *pq )( );

 

当语言无法区分那是一个声明还是一个表达式(expression)时,我们需要一个超越语言范围的规则,而该规则会将上述式子判断为一个声明

同样地,如果C++并不需要支持C原有的struct,那么class的观念可以借由关键词class来支持。但绝对令你惊讶的是,从C迁徙到C++,除了效率,另一个最常被程序员询问的问题就是:什么时候一个人应该在C++程序中以struct取代class

如果是1986年,我的答案毫不拖泥带水:绝不!在我的C++ Primer第一版和第二版中(译注:第三版已于19985月出版),关键词struct并未出现在书籍本文,只出现在附录C中,而附录C用来讨论C语言。那时候,这是一个人非万不得已不会指出的一些小小哲学问题中的一个。然而如果能够指出这个问题,你可以获得一些小小(一般公认非常小)的满足。通常问题会被这样指出:嘿,你知道吗,struct那个关键词,其实没什么用……”。但就像贝尔实验室(译注Bell Lab.C++发源地)的一位同事婉转对我说的,即使是最小的哲学问题也有人需要解答。如果一个C程序员渴望学习C++,当他发现我的书中没有提到struct,一定会相当苦恼。很显然把这个主题含入,可以提供语言移转时的救生索,让程序员攀上高峰时少点折磨。呵,多么哲学啊!

关键词的困扰

那么,让我重新问一次:什么时候一个人应该使用struct取代class答案之一是:当它让一个人感觉比较好的时候。

虽然这个答案并没有达到高技术水平,但它的确指出了一个重要的特性:关键词struct本身并不一定要象征其后随之声明的任何东西。我们可以使用struct代替class,但仍然声明publicprotectedprivate等等存取区段与一个完全public的接口,以及virtual functions和单一继承、多重继承、虚拟继承……早期,似乎每个人都得在一小时的C++简介中花费整整10分钟看清楚以下两者的相同:

 

class cplus_plus_keyword {

public:

   // mumble ...

};

 

和其C对等品:

 

struct c_keyword {

   // the same mumble

};

 

当人们以及在教科书中说到struct,他们的意思是一个数据集合体,没有private data,也没有data的相应操作(译注:指member function)。亦即纯然的C用法。这种用途应该和C++使用者自定义类型user-defined type)用法区别开来。在C这一边,这个关键词的设计理由因其用法而存在;而在C++那一边,选择structclass作为关键词,并用以导入ADT”的理由,是希望从此比较健全。这远比讨论函数需不需要一个大括号,或是要不要在变量名称和类型名称中使用下画线(例如IsRightis_right更具精神层次。

C所支持的structC++所支持的class之间,有一个观念上的重要差异。我的重点很简单:关键词本身并不提供这种差异。也就是说,如果一个人拥有下面的C++使用者自定义类型,他可以说喔,那是一个class”

 

// struct 名称(或 class 名称)暂时省略

{

public:

   operator int()

   virtual void foo();

   // ...

protected:

   static int object_count;

   // mumble

};

 

 

——本段文字节选自《深度探索C++对象模型》

图书详细信息:http://bvbroadview.blog.51cto.com/addblog.php