大部分對(duì)象在使用之前沒(méi)有正確的初始化是C++出錯(cuò)的主要領(lǐng)域 引入類的構(gòu)造函數(shù)是正確的初始化類的對(duì)象 一般什么時(shí)候觸發(fā)并調(diào)用類的構(gòu)造函數(shù)呢? 答案是:當(dāng)我們用類來(lái)定義一個(gè)類變量的時(shí)候, 如: class demo{.....}; 聲明并定義好完整的類 //當(dāng)我們用類去建立一個(gè)對(duì)象時(shí),它首先調(diào)用類的構(gòu)造函數(shù) demo d; //調(diào)用類的無(wú)參數(shù)的構(gòu)造函數(shù) demo d1(參數(shù)1,..) //按參數(shù)個(gè)數(shù)不同,調(diào)用類中不同的構(gòu)造函數(shù) 2.定義 構(gòu)造函數(shù)名和類名完全一樣,可以根據(jù)不同的參數(shù)來(lái)實(shí)現(xiàn)重載不同的構(gòu)造函數(shù) 構(gòu)造函數(shù)是沒(méi)有任何返回值的,它默認(rèn)的是public,inline函數(shù) 2.1定義格式 構(gòu)造函數(shù)可以重載,可以是無(wú)參數(shù),有參數(shù),有默認(rèn)參數(shù)) 聲明三個(gè)構(gòu)造函數(shù) 代碼如下 class item{ public: item(std::string& book="" ); //帶默認(rèn)形參的構(gòu)造函數(shù) item(std::string& ); //帶形參的構(gòu)造函數(shù) item(); //無(wú)形參的構(gòu)造函數(shù) }; 2.2構(gòu)造函數(shù)的兩種初始化成員變量的方法 如下面的類 class demo(){ public: //構(gòu)造函數(shù)在下面添加 private: int x; int y; std::string name; }; 構(gòu)造函數(shù)初始化成員有兩種方法 A.使用構(gòu)造函數(shù)的初始化列表進(jìn)行初始化 格式:funname(參數(shù)列表):(初始化列表){} 初始化列表: 成員名1(形參名1),成員名2(形參名2),成員名n(形參名n) 代碼: demo(int a=0,int b=0,std::string s=""):x(a),y(b),name(s){} B.使用構(gòu)造函數(shù)的函數(shù)體進(jìn)行初始化 格式:funname(參數(shù)列表){函數(shù)體內(nèi)賦值} 它和傳統(tǒng)的C函數(shù)差不多 代碼: demo(int a=0,int b=0,std::string s=""){ x=a; y=b; name=s; } 3.基類與派生類 3.1在基類用構(gòu)造函數(shù)初始化類的成員 "默認(rèn)形參的方式+初始化列表"來(lái)初始化基類,而參數(shù)順序不是主要的 代碼如下: class item_base( public: //兩個(gè)構(gòu)造函數(shù) item_base():(isbn(""),price(0.0){} item_base(std::string& book="",double s_price=0.0) //帶默認(rèn)形參 :isbn(book),price(s_price){} //初始化列表 ...... private: std::string book; double price ); 3.2派生類 由于初始化順序是從基類到派生類的 基類的構(gòu)造函數(shù)負(fù)責(zé)初始化基類與派生類的構(gòu)造數(shù)負(fù)責(zé)初始化派生類, 在MFC中N層繼承類庫(kù)中,都是不同層中的類負(fù)責(zé)初始化自己本身和調(diào)用上一級(jí)構(gòu)造函數(shù)進(jìn)行初始化 如何在派生類初始化從基類中繼承來(lái)的protected成員和基類的private成員呢? 答案是: 在派生類的構(gòu)造函數(shù)間接的調(diào)用基類構(gòu)造函數(shù)來(lái)實(shí)現(xiàn),派生類的初始化列表必須明確指出基類的初始化式
|