C++構造函數(shù)詳解
文章轉自公眾號:Coder梁(ID:Coder_LT)
上一篇文章我們介紹了定義了類,在使用之前,往往還需要對類進行初始化。這篇介紹的就是對類進行初始化的方法。
像是結構體,我們可以使用列表初始化的方法進行初始化:
struct Thing { ? ? char *pn; ? ? int m; }; Thing th = {"hello", 23};
但類不行,因為結構體當中的成員變量都是public
的,而類往往是私有的。這意味著我們不能直接用程序訪問數(shù)據(jù)成員,需要設計成函數(shù)。
在C++當中,這種用來構造類的函數(shù),被稱為類構造函數(shù)。構造函數(shù)的原型和函數(shù)頭有一個比較明顯的特征——它雖然沒有返回值,但沒有被聲明稱void類型,實際上構造函數(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)在我們要加入構造函數(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(); ? ? } }
注意,構造函數(shù)中的參數(shù)名不能和類成員名一致,否則會引起錯誤:
Stock::Stock(const string &company, long shares, double share_val) {}
如果一致的話,就會出現(xiàn)這樣的代碼:
shares = shares;
為了避免這種混亂,一般會在代碼風格層面加以區(qū)分。比如在谷歌代碼規(guī)范當中,類中的private成員變量中需要使用后綴_。
最后,我們來看下構造函數(shù)的使用。C++當中支持兩種方式,
我們先來看第一種,顯式地調用:
Stock food = Stock("word", 250, 2.5);
另外一種方式是隱式地調用:
Stock garment("furry", 50, 2.5);
這種方式更加緊湊,我們每次使用new
動態(tài)分配內存時,也會使用類構造函數(shù)。
Stock *pstock = new Stock("ele", 18, 19.0);
構造函數(shù)的使用不同于一般的類方法,我們無法使用對象來調用構造函數(shù)。
到此這篇關于C++構造函數(shù)詳解的文章就介紹到這了,更多相關C++構造函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++的get()函數(shù)與getline()函數(shù)使用詳解
這篇文章主要介紹了C++的get()函數(shù)與getline()函數(shù)使用詳解,是C++入門學習中的基礎知識,需要的朋友可以參考下2015-09-09matlab模擬退火算法單約束車間流水線調度解決實現(xiàn)及示例
這篇文章主要為大家介紹了matlab模擬退火算法求解單約束車間流水線調度的實現(xiàn)及示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02