8.1.1 关键字struct与class的困惑
C++(www.cppentry.com)语言对C语言的struct进行了改造,使其也可以像class那样支持成员函数的声明和定义,从而使struct变成真正的抽象数据类型(Abstract Data Type, ADT),这使得许多人对struct和class倍感困惑。
当语言支持某种特征时,是否使用这种特征则完全取决于程序员。因此,并不是说class支持成员函数的定义,我们就一定要在每一个class中都定义成员函数;也并不是说struct过去不支持成员函数定义,我们就非得用class完全取代struct。实际上就C++(www.cppentry.com)语言本身来讲,struct和class除了"默认的成员访问权限"这一点不同外,没有任何区别。
【提示8-1】: 在C++(www.cppentry.com)语言中,如果不特别指明,struct成员的默认访问限定符为public,而class成员的默认访问限定符为private。
因此,在C++(www.cppentry.com)程序中,只要你明确地声明每一个成员的访问权限,那么完全可以用struct取代class,也完全可以用class取代struct,见示例8-1。
示例8-1
|
struct SA < xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
{
public :
const char * GetName( ) const;
private :
char *m_name ;
int m_height ;
int m_weight ;
}; |
class CA
{
public :
const char * GetName( ) const;
private :
char *m_name ;
int m_height ;
int m_weight ;
}; |
本例中SA和CA这两个类型在C++(www.cppentry.com)中没有任何不同。就像Lippman所说的那样,"在C++(www.cppentry.com)中,选择使用关键字struct还是class来定义UDT或ADT完全是一种观念上的差异,而关键字本身并没有代表这种差异"。
我们再看一看C++(www.cppentry.com)鼻祖Bjarne Stroustrup是如何说的:"带类的C和C语言几乎是'代码兼容'的,并且也是连接兼容的。C的函数可以在带类的C程序中调用,带类的C函数也可以在C程序中调用;带类的C程序中的struct和C中的struct在两个语言里的布局都一致,所以可以在两个语言之间传递简单对象或组合对象。这种连接兼容性一直保持到C++(www.cppentry.com)中。"
C++(www.cppentry.com)仍然支持C风格的struct,并且还做了增强,主要是为了兼容遗留的C代码以使它们可以在新的C++(www.cppentry.com)环境下重新编译而继续"发挥余热",可以让"过程式和结构化思想根深蒂固"的C程序员比较容易地过渡到面向对象的C++(www.cppentry.com)语言。关于这个问题更具哲学性的讨论请参考Lippman所著的《Inside The C++(www.cppentry.com) Object Model》一书。
【建议8-1】: 为了不使程序产生混乱和妨碍理解,建议还使用struct定义简单的数据集合;而定义一些具有行为的ADT时最好采用class,如果采用struct似乎感觉不到面向对象的味道了。