1. 程式人生 > >構造函數與析構函數的起源

構造函數與析構函數的起源

家庭 語法錯誤 loop 安全檢查 sin 一個 code 存在 大家庭

構造函數與析構函數的起源

作為比 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\t"<<L1.name<<endl; 18 cout<<"sex\t"<<L1.sex<<endl; 19 cout<<"age\t"<<L1.age<<endl; 20 cout<<"next\t"<<L1.next<<endl; 21 return 0; 22 }

構造函數與析構函數的起源