1、構(gòu)造函數(shù)的一種使用
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、成都網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務高平,十年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108int main(void){ //Test t1 = 10;// 在構(gòu)造函數(shù)中尋找只有一個參數(shù)的 //手動的調(diào)用構(gòu)造函數(shù); Test t2 = Test(1, 2); //直接調(diào)用構(gòu)造函數(shù)--->匿名對象; //直接調(diào)用Test的有參構(gòu)造函數(shù),初始化t2對象; 只會調(diào)用一次構(gòu)造函數(shù)(直接把匿名對象轉(zhuǎn)成t2); }
2、構(gòu)造與賦值語句
Test g(){ //返回為對象,我就給你返回一個新的對象(匿名對象); } int main(void){ Test t1(1, 2); Test t2; Test t3 = t1; //用t1初始化t3,調(diào)用拷貝構(gòu)造函數(shù); Test t3(t1); t2 = t1; //利用t1給t2賦值,調(diào)用賦值語句; Test m = g(); //函數(shù)的返回值為對象,用匿名對象初始化m,此時C++編譯器將直接把匿名對象轉(zhuǎn)化為有名對象m; m = g();//此時匿名對象將沒有用,賦值完成,沒有轉(zhuǎn)正,將被析構(gòu) } //在定義類時,只要你寫了構(gòu)造函數(shù),則必須要用你自己寫的,此時C++編譯器將不會給你提供默認的構(gòu)造和拷貝構(gòu)造函 數(shù)
3、構(gòu)造函數(shù)的執(zhí)行順序
執(zhí)行順序:先執(zhí)行被組合對象的構(gòu)造函數(shù),如果有多個,按定義順序執(zhí)行,而不是按初始化列表的順序執(zhí)行;
析構(gòu)函數(shù)的調(diào)用順序相反;
初始化列表用來給const屬性賦值;
代碼如下:
#includeusing namespace std; class A{ public: A(int a){ m = a; } private: int m; }; //在構(gòu)造中調(diào)用構(gòu)造函數(shù)是一種危險的行為,里面是一個匿名對象;用完立即調(diào)用析構(gòu), //參數(shù)列表也可以在拷貝構(gòu)造函數(shù)上面使用; class B{ public: //構(gòu)造函數(shù)的初始化列表:解決,在B類中,組合了A類對象, //根據(jù)構(gòu)造函數(shù)的規(guī)則,寫了A類的構(gòu)造函數(shù),必須要用; B(int q, int a, int b, int c) : a1(b), a2(c), c(0){ x = q; y = a; } //執(zhí)行順序:先執(zhí)行被組合對象的構(gòu)造函數(shù),如果有多個,按定義順序執(zhí)行,而不是按初始化列表的順序執(zhí)行; //析構(gòu)函數(shù)的調(diào)用順序相反; //構(gòu)造調(diào)用順序:a1、a2、b //初始化列表用來給const屬性賦值; private: int x; int y; A a1; A a2; const int c; //常量c必須初始化(通過參數(shù)列表) }; int main(void){ B b(1, 2, 3, 4); }
4、new和delete
new能執(zhí)行類的構(gòu)造函數(shù),delete能行類的析構(gòu)函數(shù);
malloc free new delete可以互換使用,只不過new先開辟空間-->調(diào)用構(gòu)造;delete--->先析構(gòu),在釋放空間;
5、static
靜態(tài)成員不占這個類的字節(jié)的大小;------->不屬于這個實例的,相當于全局變量;
(1)、代碼如下:
#includeusing namespace std; class A{ public: A(){} int getD(){ return d; } void Add(){ d++; } static void getC(){ //靜態(tài)成員函數(shù); //靜態(tài)方法只能調(diào)用靜態(tài)的成員、函數(shù); cout<<"d:"< (2)、運行結(jié)果:
6、賦值語句(重載=運算符難點)
i>、先把舊的內(nèi)存釋放掉;
ii>、返回一個引用; 為了支持連等;
iii>、根據(jù)大小分配內(nèi)存;7、繼承中的字節(jié)大小
子類繼承父類,在訪問上有所限制,但是在內(nèi)存空間上對屬性成員是全部的繼承了下來;靜態(tài)變量在全局區(qū),所以對靜態(tài)變量不計入字節(jié)大小的計算;
class M{};//空的類,占一個標示,1字節(jié);
8、函數(shù)模板
普通函數(shù)的調(diào)用:可以進行隱式的類型轉(zhuǎn)換
函數(shù)模版的調(diào)用:將嚴格按照類型進行匹配,不會進行自動類型轉(zhuǎn)換;9、友元函數(shù)的模板化
對友元函數(shù)實現(xiàn)<<運算符重載
(1)、代碼如下:
#includeusing namespace std; //結(jié)論:友元函數(shù)的類模版比較復雜; template class Complex; //類的前置聲明 template ostream& operator<<(ostream &out, const Complex &c);//友元函數(shù)的前置聲明 template class Complex{ public: friend ostream& operator<< (ostream &out, const Complex &c); //對<<的后面加上 ;進行友元函數(shù)的模版化; Complex(Type a, Type b); Complex(const Complex &c){} Complex& operator=(const Complex &c){} ~Complex(){} public: void printComplex(); Complex operator+(const Complex &c); private: Type a; Type b; }; //成員函數(shù)實現(xiàn) + template Complex ::Complex(Type a, Type b){ this->a = a; this->b = b; } template void Complex ::printComplex(){ cout<<"a:"< Complex Complex ::operator+(const Complex &c){ return Complex(a+c.a, b+c.b); } //友元函數(shù)實現(xiàn)<<運算符重載 template ostream& operator<<(ostream &out, const Complex &c){ out<<"("< c1(1, 2); Complex c2(3, 4); Complex c3 = c1 + c2; cout< (2)、運行結(jié)果
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
名稱欄目:友元函數(shù)<<的模板化-創(chuàng)新互聯(lián)
本文鏈接:http://weahome.cn/article/codiih.html