新聞中心
在下面文章主要介紹C++構(gòu)造函數(shù)的相關(guān)問題,使用一個簡單的構(gòu)造函數(shù)定義了名為 Taxi 的類,然后使用 new 運算符來實例化該類,在為新對象分配內(nèi)存之后,new 運算符立即調(diào)用 Taxi 構(gòu)造函數(shù)。

10多年的天峻網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整天峻建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“天峻網(wǎng)站設(shè)計”,“天峻網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
C++構(gòu)造函數(shù)初始化列表以一個冒號開始,接著是以逗號分隔的數(shù)據(jù)成員列表,每個數(shù)據(jù)成員后面跟一個放在括號中的初始化式。例如:
- class CExample {
- public:
- int a;
- float b;
- //構(gòu)造函數(shù)初始化列表
- CExample(): a(0),b(8.8)
- {}
- //構(gòu)造函數(shù)內(nèi)部賦值
- CExample()
- {
- a=0;
- b=8.8;
- }
- };
上面的例子中兩個構(gòu)造函數(shù)的結(jié)果是一樣的。上面的C++構(gòu)造函數(shù)(使用初始化列表的構(gòu)造函數(shù))顯式的初始化類的成員;而沒使用初始化列表的構(gòu)造函數(shù)是對類的成員賦值,并沒有進行顯式的初始化。
初始化和賦值對內(nèi)置類型的成員沒有什么大的區(qū)別,像上面的任一個構(gòu)造函數(shù)都可以。對非內(nèi)置類型成員變量,為了避免兩次構(gòu)造,推薦使用類構(gòu)造函數(shù)初始化列表。但有的時候必須用帶有初始化列表的構(gòu)造函數(shù):
- class CMyClass {
- CMyClass(int x, int y);
- int m_x;
- int m_y;
- };
- CMyClass::CMyClass(int x, int y) : m_y(y), m_x(m_y)
- {
- }
成員類型是沒有默認C++構(gòu)造函數(shù)的類。若沒有提供顯示初始化式,則編譯器隱式使用成員類型的默認C++構(gòu)造函數(shù),若類沒有默認構(gòu)造函數(shù),則編譯器嘗試使用默認構(gòu)造函數(shù)將會失敗。
結(jié)果上相同,但是性能上存在很大的差別。因為類類型的數(shù)據(jù)成員對象在進入函數(shù)體前已經(jīng)構(gòu)造完成,也就是說在成員初始化列表處進行構(gòu)造對象的工作。調(diào)用構(gòu)造函數(shù),在進入函數(shù)體之后,進行的是對已經(jīng)構(gòu)造好的類對象的賦值,又調(diào)用個拷貝賦值操作符才能完成(如果并未提供,則使用編譯器提供的默認按成員賦值行為。
你可能以為上面的代碼將會首先做m_y=I,然后做m_x=m_y,最后它們有相同的值。但是編譯器先初始化m_x,然后是m_y,,因為它們是按這樣的順序聲明的。結(jié)果是m_x將有一個不可預(yù)測的值。
有兩種方法避免它,一個是總是按照你希望它們被初始化的順序聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。
【編輯推薦】
- C與C++中標(biāo)準(zhǔn)輸入實現(xiàn)方式上的一點區(qū)別
- C++編譯器如何對Const常量進行分配存儲空間
- C++類庫設(shè)計的基本構(gòu)思與方法
- 玩轉(zhuǎn)C++語言的幾種方法
- 如何更好的進行C++代碼編制
當(dāng)前標(biāo)題:淺析C++中的C++構(gòu)造函數(shù)
分享URL:http://www.5511xx.com/article/cdcsgeh.html


咨詢
建站咨詢
