构造函数与析构函数的起源
作为比 C 更先进的语言,C++提供了更好的机制来增强程序的安全性。C++编译器 具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序
员的大忙。
但是程序通过了编译检查并不表示错误已经不存在了,在 “错误”的大家庭 里, “语法错误”的地位只能算是小弟弟。级别高的错误通常隐藏得很深,就象狡猾的罪 犯,想逮住他可不容易。 根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的, 而初始化和清除工作很容易被人遗忘。
Stroustrup 在设计 C++语言时充分考虑了这个问题 并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。 当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这下就 不用担心忘了对象的初始化和清除工作。 构造函数与析构函数的名字不能随便起,必须让编译器认得出才可以被自动执行。
Stroustrup 的命名方法既简单又合理:让构造函数、析构函数与类同名,由于析构函数的 目的与构造函数的相反,就加前缀‘~’以示区别。 除了名字外,构造函数与析构函数的另一个特别之处是没有返回值类型,这与返回 值类型为 void 的函数不同。构造函数与析构函数的使命非常明确,就象出生与死亡 ,光 溜溜地来光溜溜地去。如果它们有返回值类型,那么编译器将不知所措。为了防止节外 生枝,干脆规定没有返回值类型。
1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 int main(int argc, char** argv) { 6 //定义名为list的递归结构 7 struct list { 8 char name[10]; 9 int sex; 10 int age; 11 list *next; //成员next为指向其自身结构的指针 12 }; 13 14 //使用递归结构变量 15 list L1={"WeiPing",1,35.5,NULL}; 16 cout<<"L1:"<<endl; 17 cout<<"name "<<L1.name<<endl; 18 cout<<"sex "<<L1.sex<<endl; 19 cout<<"age "<<L1.age<<endl; 20 cout<<"next "<<L1.next<<endl; 21 return 0; 22 }