高质量C /C编程指南 -- 第9章 类的构造函数、…

2008-02-23 05:04:41来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

构造函数、析构函数和赋值函数是每个类最基本的函数。他们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。

每个类只有一个析构函数和一个赋值函数,但能够有多个构造函数(包含一个拷贝构造函数,其他的称为普通构造函数)。对于任意一个类A,假如不想编写上述函数,C 编译器将自动为A产生四个缺省的函数,如

A(void); // 缺省的无参数构造函数

A(const A &a); // 缺省的拷贝构造函数

~A(void); // 缺省的析构函数

A & operate =(const A &a); // 缺省的赋值函数

这不禁让人疑惑,既然能自动生成函数,为什么还要程式员编写?

原因如下:

(1)假如使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,C 发明人Stroustrup的好心好意白费了。

(2)“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

对于那些没有吃够苦头的C 程式员,假如他说编写构造函数、析构函数和赋值函数很容易,能够不用动脑筋,表明他的认识还比较肤浅,水平有待于提高。

本章以类String的设计和实现为例,深入阐述被很多教科书忽视了的道理。String的结构如下:

class String

{

public:

String(const char *str = NULL); // 普通构造函数

String(const String &other); // 拷贝构造函数

~ String(void); // 析构函数

String & operate =(const String &other); // 赋值函数

private:

char *m_data; // 用于保存字符串

};

9.1 构造函数和析构函数的起源
作为比C更先进的语言,C 提供了更好的机制来增强程式的安全性。C 编译器具备严格的类型安全检查功能,他几乎能找出程式中任何的语法问题,这的确帮了程式员的大忙。但是程式通过了编译检查并不表示错误已不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是小弟弟。级别高的错误通常隐藏得很深,就象狡猾的罪犯,想逮住他可不容易。

根据经验,不少难以察觉的程式错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。Stroustrup在设计C 语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这下就不用担心忘了对象的初始化和清除工作。

构造函数和析构函数的名字不能随便起,必须让编译器认得出才能够被自动执行。Stroustrup的命名方法既简单又合理:让构造函数、析构函数和类同名,由于析构函数的目的和构造函数的相反,就加前缀‘~’以示区别。

除了名字外,构造函数和析构函数的另一个特别之处是没有返回值类型,这和返回值类型为void的函数不同。构造函数和析构函数的使命很明确,就象出生和死亡,光溜溜地来光溜溜地去。假如他们有返回值类型,那么编译器将不知所措。为了防止节外生枝,干脆规定没有返回值类型。(以上典故参考了文献[Eekel, p55-p56])



[1] [2] [3] [4] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 高质量C /C编程指南 -- 第11章 其他编程经验

下一篇: 高质量C /C编程指南 -- 第8章 C 函数的高级特性

热门词条
热门标签