EasyC++,構(gòu)造函數(shù)
大家好,我是梁唐。
想要追求更好閱讀體驗的同學(xué),可以點擊「閱讀原文」訪問github倉庫。
構(gòu)造函數(shù)
我們定義了類之后,在使用之前,往往還需要對類進行初始化。這篇介紹的就是對類進行初始化的方法。
像是結(jié)構(gòu)體,我們可以使用列表初始化的方法進行初始化:
- struct Thing {
- char *pn;
- int m;
- };
- Thing th = {"hello", 23};
但類不行,因為結(jié)構(gòu)體當中的成員變量都是public的,而類往往是私有的。這意味著我們不能直接用程序訪問數(shù)據(jù)成員,需要設(shè)計成函數(shù)。
在C++當中,這種用來構(gòu)造類的函數(shù),被稱為類構(gòu)造函數(shù)。構(gòu)造函數(shù)的原型和函數(shù)頭有一個比較明顯的特征——它雖然沒有返回值,但沒有被聲明稱void類型,實際上構(gòu)造函數(shù)沒有聲明類型。
比如我們還是之前的類:
- class Stock {
- private:
- std::string company;
- long shares;
- double share_val;
- double total_val;
- void set_tot() {total_val = shares * share_val;}
- public:
- void accquire(const std::string &co, long n, double pr);
- void buy(long num, double price);
- void sell(long num, double price);
- void update(double price);
- void show();
- };
- #endif
現(xiàn)在我們要加入構(gòu)造函數(shù),首先是在類中加上聲明。
- class Stock {
- ...
- Stock(const string &co, long n=0, double pr=0.0);
- }
注意看,我們實現(xiàn)定義的時候,函數(shù)是沒有返回類型的:
- Stock::Stock(const string &co, long n, double pr) {
- company = co;
- if (n < 0) {
- std::cerr << "Number of shares can't be negative;"
- << company << " shares set to 0.\n";
- shares = 0;
- }else {
- shares = n;
- share_val = pr;
- set_tot();
- }
- }
注意,構(gòu)造函數(shù)中的參數(shù)名不能和類成員名一致,否則會引起錯誤:
- Stock::Stock(const string &company, long shares, double share_val) {}
如果一致的話,就會出現(xiàn)這樣的代碼:
- shares = shares;
為了避免這種混亂,一般會在代碼風(fēng)格層面加以區(qū)分。比如在谷歌代碼規(guī)范當中,類中的private成員變量中需要使用后綴_。
最后,我們來看下構(gòu)造函數(shù)的使用。C++當中支持兩種方式,我們先來看第一種,顯式地調(diào)用:
- Stock food = Stock("word", 250, 2.5);
另外一種方式是隱式地調(diào)用:
- Stock garment("furry", 50, 2.5);
這種方式更加緊湊,我們每次使用new動態(tài)分配內(nèi)存時,也會使用類構(gòu)造函數(shù)。
- Stock *pstock = new Stock("ele", 18, 19.0);
構(gòu)造函數(shù)的使用不同于一般的類方法,我們無法使用對象來調(diào)用構(gòu)造函數(shù)。
本文轉(zhuǎn)載自微信公眾號「Coder梁」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Coder梁公眾號。