詳解C++構(gòu)造函數(shù)
1.作用
一種特殊類型的方法,在每次實(shí)例化對(duì)象時(shí)運(yùn)行
2.代碼舉例
2.1 示例1:
#include <iostream> class A { public: float a, b; void print() { std::cout << a << " , " << b << std :: endl; } }; int main() { A a; a.print(); return 1; }
運(yùn)行結(jié)果:
當(dāng)我們實(shí)例化A,系統(tǒng)為它分配內(nèi)存,我們沒有初始化內(nèi)存,得到的是內(nèi)存空間原有的那些東西
2.2 示例2:
當(dāng)在main中添加 std::cout << a.a << " , " << a.b << std :: endl;
int main() { A a; std::cout << a.a << " , " << a.b << std :: endl; a.print(); return 1; }
(ubuntu下 vs code )
運(yùn)行結(jié)果:
不同編譯器可能不一樣,有的會(huì)編譯不過報(bào)錯(cuò)(未初始化局部變量),原因有待深入…
3. 使用
3.1 使用構(gòu)造函數(shù)初始化
#include <iostream> class A { public: float a, b; A () { a = 0.0f; b = 0.0f; } void print() { std::cout << a << " , " << b << std :: endl; } }; int main() { A a; std::cout << a.a << " , " << a.b << std :: endl; a.print(); return 1; }
結(jié)果:
3.2 有參數(shù)的構(gòu)造函數(shù)
#include <iostream> class A { public: float a, b; // 無(wú)參構(gòu)造 A () { a = 0.0f; b = 0.0f; } // 有參構(gòu)造 A(float c,float d) { a = c; b = d; } void print() { std::cout << a << " , " << b << std :: endl; } }; int main() { A a(5.0,6.0); std::cout << a.a << " , " << a.b << std :: endl; a.print(); return 1; }
一個(gè)類可以有很多構(gòu)造函數(shù) 前提是參數(shù)個(gè)數(shù)不同或者參數(shù)類型不同
類似于同名函數(shù)(函數(shù)重載 即有相同的函數(shù)名,但是有不同的參數(shù)個(gè)數(shù)與參數(shù)類型)
A(float c,float d) { } A(int c,int d) { } A(float c,float d,float e) { }
這里需要注意有參構(gòu)造的時(shí)候注意傳值類型
如 float
類型
A a(5.0f , 6.0f);
3.3 默認(rèn)的構(gòu)造函數(shù)
每個(gè)類默認(rèn)有一個(gè)空參空實(shí)體的構(gòu)造函數(shù)(如果寫了構(gòu)造函數(shù),則默認(rèn)構(gòu)造函數(shù)就沒有了,需要時(shí)需手動(dòng)添加)
A () { }
如果不想使用構(gòu)造函數(shù)有兩種方法
// 1 私有化 private : A(){} // 2 刪掉 A() = delete;
4. 成員初始化列表
例1:正常初始化
#include <iostream> using namespace std; class Student { private: const char *m_name; int m_age; float m_score; public: // 無(wú)參構(gòu)造 給變量賦定值 Student() { m_name = "aaa"; m_age = 1; m_score = 99.0; } // 有參構(gòu)造 給變量動(dòng)態(tài)賦值 Student(const char *name, int age, float score) { m_name = name; m_age = age; m_score = score; } void print () { cout << m_name << " ," << m_age << " ," << m_score << endl; } }; int main(int argc, char const *argv[]) { Student s1; s1.print(); Student s2("ccc" , 2 , 99.3f); s2.print(); return 0; }
例2:成員初始化列表
#include <iostream> #include <string> using namespace std; class Student { private: // string m_name; // char *m_name; const char *m_name; int m_age; float m_score; public: // 無(wú)參 成員初始化列表 Student() : m_name("bbb") , m_age(2) , m_score(93.0f) { // TODO } // 有參 成員初始化列表 /** * const char *name 常量指針 const 修飾*name *name不可改變 * char * const name 指針常量 const 修飾 name name不可改變 * char const *name 常量指針 等同于 const char *name * * 這里不寫const 會(huì)報(bào)警告 但可以編過 * */ Student(const char *name, int age, float score) : m_name(name) , m_age(age) , m_score(score) { // TODO } void print () { cout << m_name << " ," << m_age << " ," << m_score << endl; } }; int main(int argc, char const *argv[]) { Student s1; s1.print(); Student s2("ccc",2,99.3f); s2.print(); return 0; }
運(yùn)行結(jié)果都一樣:
aaa ,1 ,99
ccc ,2 ,99.3
使用構(gòu)造函數(shù)初始化列表并沒有效率上的優(yōu)勢(shì),僅僅是書寫方便,尤其是成員變量較多時(shí),這種寫法非常簡(jiǎn)單明了。
初始化列表可以用于全部成員變量,也可以只用于部分成員變量
Student(char *name, int age, float score): m_name(name){ m_age = age; m_score = score; }
NOTE:成員變量的初始化順序與初始化列表中列出的變量的順序無(wú)關(guān),它只與成員變量在類中聲明的順序有關(guān)。
為啥推薦成員初始化列表的寫法?
#include <iostream> using namespace std; class Example { public: Example() { cout<< "Create Example" << endl; } Example(int x) { cout<< "Create Example with " << x << endl; } }; class A { private: string m_name; // 創(chuàng)建了 Example 的無(wú)參構(gòu)造 對(duì)象 Example m_Example; public: A() { m_name = "name"; // 創(chuàng)建新的有參構(gòu)造對(duì)象覆蓋第一次賦值 m_Example = Example(1); } }; int main(int argc, char const *argv[]) { A a; return 0; }
結(jié)果:
A的構(gòu)造函數(shù)換成成員初始化列表的寫法
// A() : m_name ("name"),m_Example(Example(1)) 與下面寫法相同 A() : m_name ("name"),m_Example(1) { }
結(jié)果:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言如何實(shí)現(xiàn)頭插法建立單鏈表
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)頭插法建立單鏈表的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語(yǔ)言 小游戲打磚塊實(shí)現(xiàn)流程詳解
打磚塊游戲是一種動(dòng)作電子游戲的名稱。玩家操作一根螢?zāi)簧纤降摹鞍糇印?,讓一顆不斷彈來(lái)彈去的“球”在撞擊作為過關(guān)目標(biāo)消去的“磚塊”的途中不會(huì)落到螢?zāi)坏紫隆G蚺龅酱u塊、棒子與底下以外的三邊會(huì)反彈,落到底下會(huì)失去一顆球,把磚塊全部消去就可以破關(guān)2021-11-11關(guān)于C語(yǔ)言動(dòng)態(tài)內(nèi)存管理介紹
大家好,本篇文章主要講的是關(guān)于C語(yǔ)言動(dòng)態(tài)內(nèi)存管理介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01虛函數(shù)與純虛函數(shù)(C++與Java虛函數(shù)的區(qū)別)的深入分析
本篇文章是對(duì)虛函數(shù)與純虛函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C語(yǔ)言字符函數(shù)isalnum()和iscntrl()詳解
大家好,本篇文章主要講的是C語(yǔ)言字符函數(shù)isalnum()和iscntrl()詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02matlab?GUI指紋識(shí)別門禁系統(tǒng)介紹及源碼實(shí)現(xiàn)
這篇文章主要為大家介紹了matlab?GUI指紋識(shí)別門禁系統(tǒng)的介紹及源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02