C++構造函數
<上一節
下一節>
構造函數是類中一種特殊的成員函數,其特殊之處有三點:
一個類中可以有多個構造函數,構造函數之間構成函數重載的關系。
[例1] 構造函數舉例:
構造函數與普通成員函數類似,可以在類內部定義,也可以在類外部定義。第一個沒有參數的構造函數book(),其定義就在類內部;第二個構造函數book(char * a, double p)在類內部聲明,類外部定義。
通常如果在定義類的時候,程序設計人員沒有主動聲明任何一個構造函數的時候,系統會自動生成一個默認構造函數,默認構造函數就是不帶任何參數的構造函數。其它帶參數的構造函數統稱為帶參構造函數。
如果在類中聲明了任何一個構造函數,則系統不會自動生成默認構造函數。構造函數同樣能夠使用類中的成員變量。
構造函數的作用在本例中也可以很清楚的看出來。構造函數就是用于初始化對象的,并且負責處理對象創建時需要處理的其它事務,在創建對象時會被自動調用。
本例中的主函數中,先定義了一個Alice對象,該對象其實在創建的時候已經自動調用了默認的構造函數的。若我們在類定義的時候不定義默認構造函數,則book Alice;這一句創建對象的語句則會出現編譯錯誤,因為我們創建了帶參構造函數,故默認構造函數不會被自動創建,因此在用book Alice;語句創建對象的時候無相應的構造函數能夠調用,因此會初始化對象出錯。
在主函數中,當我們創建Harry對象時,其后還跟有一個括號,里面還有兩個參數,這一句創建對象會自動調用book(char * a, double p)構造函數進行對象的初始化,初始化之后,Harry.price = 49.9,而Harry.title = “Harry Potter”,因此在調用Harry.display()函數的時候,能夠打印出“The price of Harry Potter is $49.9”也是不足為奇的。
構造函數除了自身獨有的三個特性以外,其它與普通成員函數類似,可以完成普通函數能完成的所有功能,如函數調用、條件判斷、循環、賦值等,如下例所示。
[例2] 在構造函數中調用函數:
- 構造函數的函數名必須與類名相同;
- 構造函數無返回值;
- 當我們創建類對象的時候構造函數會被自動調用,而無需我們主動調用。
一個類中可以有多個構造函數,構造函數之間構成函數重載的關系。
[例1] 構造函數舉例:
#include<iostream> using namespace std; class book { public: book(){} book(char* a, double p); void setprice(double a); double getprice(); void settitle(char* a); char * gettitle(); void display(); private: double price; char * title; }; book::book(char* a, double p) { title = a; price = p; } void book::display() { cout<<"The price of "<<title<<" is $"<<price<<endl; } void book::setprice(double a) { price = a; } double book::getprice() { return price; } void book::settitle(char* a) { title = a; } char * book::gettitle() { return title; } int main() { book Alice; Alice.settitle("Alice in Wonderland"); Alice.setprice(29.9); Alice.display(); book Harry("Harry Potter", 49.9); Harry.display(); return 0; }本例中定義了一個book類,在該類中定義了兩個private屬性的成員變量price和title,定義的成員函數有6個,后面四個在前幾節中已經介紹過了,兩個函數book()和book(char * a, double p)即為需要介紹的構造函數。這兩個函數無返回值,函數名與類名相同,這是構造函數最明顯的特征。
構造函數與普通成員函數類似,可以在類內部定義,也可以在類外部定義。第一個沒有參數的構造函數book(),其定義就在類內部;第二個構造函數book(char * a, double p)在類內部聲明,類外部定義。
通常如果在定義類的時候,程序設計人員沒有主動聲明任何一個構造函數的時候,系統會自動生成一個默認構造函數,默認構造函數就是不帶任何參數的構造函數。其它帶參數的構造函數統稱為帶參構造函數。
如果在類中聲明了任何一個構造函數,則系統不會自動生成默認構造函數。構造函數同樣能夠使用類中的成員變量。
構造函數的作用在本例中也可以很清楚的看出來。構造函數就是用于初始化對象的,并且負責處理對象創建時需要處理的其它事務,在創建對象時會被自動調用。
本例中的主函數中,先定義了一個Alice對象,該對象其實在創建的時候已經自動調用了默認的構造函數的。若我們在類定義的時候不定義默認構造函數,則book Alice;這一句創建對象的語句則會出現編譯錯誤,因為我們創建了帶參構造函數,故默認構造函數不會被自動創建,因此在用book Alice;語句創建對象的時候無相應的構造函數能夠調用,因此會初始化對象出錯。
在主函數中,當我們創建Harry對象時,其后還跟有一個括號,里面還有兩個參數,這一句創建對象會自動調用book(char * a, double p)構造函數進行對象的初始化,初始化之后,Harry.price = 49.9,而Harry.title = “Harry Potter”,因此在調用Harry.display()函數的時候,能夠打印出“The price of Harry Potter is $49.9”也是不足為奇的。
構造函數除了自身獨有的三個特性以外,其它與普通成員函數類似,可以完成普通函數能完成的所有功能,如函數調用、條件判斷、循環、賦值等,如下例所示。
[例2] 在構造函數中調用函數:
class book { public: book(){} book(char* a, double p){init(a,p);}; void setprice(double a); double getprice(); void settitle(char* a); char * gettitle(); void display(); void init(char* a, double p); private: double price; char * title; }; void book::init(char* a, double p) { title = a; price = p; }
<上一節
下一節>