亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ 類的構造函數詳解及實例

2020-01-26 14:22:43
字體:
來源:轉載
供稿:網友

C++ 類的構造函數

默認構造函數

如果你定義一個類,并且沒有給它定義構造函數。編譯器會為這個類提供默認的構造函數。如果你提供了構造函數,編譯器是不會再為你提供一個默認構造函數的。編譯器提供的默認構造函數什么都沒做。類的成員變量將遵守默認的初始化規則。

編譯器提供的默認構造函數的初始化規則:

在棧和堆中的類對象的內置或復合類型成員變量將為臟數據;

在全局變量區的類對象的內置或復合類型成員變量初始化為0;

類對象成員將調用默認的構造函數來初始化;

#include <iostream> using namespace std; class Box {   public:   int length;   int width; }; Box box1; int main() {   Box box2;   Box *pbox3 = new Box;   cout<<"box1.length == "<<box1.length<<" box1.width == "<<box1.width<<endl;   cout<<"box2.length == "<<box2.length<<" box2.width == "<<box2.width<<endl;   cout<<"box3.length == "<<pbox3->length<<" box3.width == "<<pbox3->width<<endl;   return 0; } 

上面代碼的結果為:

box1.length == 0 box1.width == 0
box2.length == 2686792 box2.width == 1987092020
box3.length == 3811912 box3.width == 3801284 

帶默認實參的構造函數

就像對普通函數一樣可以為構造函數的參數指定默認值。

如果你為類定義了一個默認構造函數,又定義了一個所有參數都有默認的值的構造函數。(技術上來說,這是重載了)用默認構造函數構造類對象時將會產生編譯錯誤。因為編譯器不知道選擇哪個重載函數。 

構造函數的初始化列表

除了在構造函數的函數體中用明確的賦值表達式給類成員賦值(從嚴格的概念上來說這不是初始化),推薦的做法是使用初始化列表。初始化列表以一個冒號開始,緊接著一個一個用逗號分隔的數據成員列表,每個數據成員后跟一個放在圓括號中的初始化式。構造函數的初始化列表只能在實現中指定而不能在定義體中指定。而類的成員函數(構造函數也不例外)的實現既可以在類的定義體中(內聯函數),也可以在類的實現中。 

成員的初始化次序

每個成員只能在初始化列表中指定一次。而且成員在初始化列表中出現的順序并不代表成員的實際初始化順序。成員的初始化順序是按照它們在類定義中出現的順序來的。所以成員的初始化最好不要相互依賴,如果你確定它們要相互依賴,你得清楚它們在類定義中的出現順序。

構造函數的構造的兩個階段

 (1)初始化階段(根據默認的變量初始化規則和初始化列表來執行);(2)構造函數中的函數體執行階段(這時構造函數體內的賦值語句才會執行)。

為什么推薦使用初始化列表?

1.在許多類中,初始化和賦值嚴格來講都是低效率的:數據成員可能已經被直接初始化了,還要對它進行初始化和賦值。
2.比第一點提到的效率更重要的是,某些類型的數據成員必須要初始化。

       有些類型的成員必須在初始化列表中進行初始化,比如const對象和引用類型對象。它們只能初始化而不能賦值。在執行構造函數體之前必須完成初始化。在函數體內對它們賦值會引發編譯錯誤。

        類類型的成員變量也要特別注意,如果你不對它在初始化列表中的初始化,編譯器將會嘗試在初始化階段調用它的默認構造函數給他初始化。如果它沒有默認的構造函數,這將會導致運行時錯誤。另一種情況是你只在構造函數體內對類對象的成員進行了賦值。初始化階段將會調用該類對象成員的默認構造函數,計算階段將會調用構造函數體內指定構造函數。意思是該類對象成員調用了兩次構造函數,第二次的會覆蓋第一次的。

構造函數與隱式類型轉換、explicit

       C++支持類型自動轉換??梢远x如何將其他類的對象隱式轉換為我們的類類型,也可以將我們的類類型對象隱式的轉換為其他類型。構造函數有個隱含規則:可以用單個實參類調用的構造函數定義了一個從該形參類型到該類類型的一個隱式轉換。有時候這不是你想要的,并且會引發錯誤。例如你定義了下面的類。

class Box {   public:   Box(int x=1,int y=1);   int length;   int width; }; Box::Box(int x,int y):length(x),width(y) { } 

如果你Box box= 2來初始化一個Box對象。編譯器將2隱式轉換為一個Box對象,相當于調用了構造函數Box(2)。

如果你在需要Box類型參數的函數調用中傳入的是一個int實參,將會構造一個臨時的Box對象再傳入函數作參數。函數結束后,這Box對象也就消失了,這有什么用呢?這幾乎肯定是一個錯誤。對此我們可以:

1.用關鍵字explicit阻止構造函數定義的隱式轉換

       在類構造函數的聲明前加上explicit關鍵字(注意不能在定義中加),可以阻止隱式轉換。

class Box {   public:   explicit Box(int x=1,int y=1);   int length;   int width; }; 

如果你再這樣定義一個Box對象:Box box = 2或者將int類型對象作為參數當做Box對象傳給某個函數,將會引發編譯錯誤。

2.每次轉換,自己顯示的使用構造函數。這樣可以防止隱式轉換。
在需要Box對象實參的的函數調用中用func(Box(2))來調用類的構造函數創建一個臨時對象,防止自動的隱式轉換。

建議:除非有明確的理由允許隱式轉換,可以用單個參數調用的構造函數都應該定義為explicit。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲www在线| 久久久国产视频91| 成人久久一区二区三区| 日韩av大片在线| 亚洲最大av网| 亚洲第一视频在线观看| 欧美高清第一页| 欧美日韩免费观看中文| 欧美成人精品在线| 日韩欧美成人网| 青青草一区二区| 成人免费视频a| 国产精品久久久亚洲| 日韩av在线不卡| 国产精品十八以下禁看| 69视频在线免费观看| 亚洲最大的成人网| 久久久久久国产精品三级玉女聊斋| 国产99久久久欧美黑人| 久久精品一本久久99精品| 亚洲电影av在线| 亚洲国产女人aaa毛片在线| 8090成年在线看片午夜| 欧美在线观看视频| 日韩精品视频三区| 久久999免费视频| 亚洲人成在线免费观看| 91av成人在线| 热久久视久久精品18亚洲精品| 91精品国产91久久久| 97成人精品视频在线观看| 国产精品jizz在线观看麻豆| 久久久久久高潮国产精品视| 午夜精品三级视频福利| 中文字幕国产日韩| 一区二区亚洲欧洲国产日韩| 亚洲精品国产美女| 精品福利在线看| 亚洲一区二区三区香蕉| 91视频88av| 国产精品亚发布| 91爱爱小视频k| 亚洲欧洲日产国产网站| 亚洲一区二区三区在线免费观看| 久久不射热爱视频精品| 日韩一区在线视频| 青草青草久热精品视频在线网站| 欧美激情第三页| 亚洲欧美国产精品va在线观看| 2019中文字幕免费视频| 国产91在线播放精品91| 亚洲精品第一页| www.国产一区| 成人在线视频网| 日韩视频在线免费观看| 韩国视频理论视频久久| 久久九九亚洲综合| 欧美视频在线看| 久久国产精品久久久久久久久久| 成人免费视频97| 亚洲一区中文字幕在线观看| 91sa在线看| 欧美与黑人午夜性猛交久久久| 亚洲人成电影网站色xx| 欧美亚洲另类在线| 91亚洲人电影| 国产精品露脸自拍| 日韩精品免费在线观看| 国产精品视频1区| www.亚洲免费视频| 欧美日韩国产一区中文午夜| 欧美精品九九久久| 亚洲精品美女在线| 一区二区三区回区在观看免费视频| 欧美日本啪啪无遮挡网站| 国产精品久久久久久久久粉嫩av| 国产精品视频一区二区高潮| 精品国产乱码久久久久久天美| 亚洲国产精品va在线| 国产精品久久77777| 中文字幕精品国产| 精品久久久久久亚洲精品| 2019中文字幕全在线观看| 日韩一区二区久久久| 欧美性受xxxx黑人猛交| 97国产suv精品一区二区62| 欧美丰满片xxx777| 亚洲自拍偷拍第一页| 欧美中文字幕视频| 欧美大全免费观看电视剧大泉洋| 亚洲欧美在线看| 高清在线视频日韩欧美| 国产日韩精品在线观看| 国产精品va在线播放我和闺蜜| 国产精品久久久久久久久久久久久| 精品视频在线播放| 日韩成人黄色av| 亚洲激情电影中文字幕| 久久综合88中文色鬼| 91香蕉电影院| 国产91精品黑色丝袜高跟鞋| 中文字幕日韩av综合精品| 亚洲自拍偷拍视频| 欧美黑人性视频| 91视频8mav| 亚洲国产中文字幕久久网| 在线观看视频99| 欧美日韩国产麻豆| 久久久久久美女| 亚洲男人av在线| 日韩美女视频免费在线观看| 按摩亚洲人久久| 亚洲韩国日本中文字幕| 亚洲 日韩 国产第一| 亚洲一区av在线播放| 最近中文字幕2019免费| 欧美日韩国产中文精品字幕自在自线| 国产丝袜一区二区三区免费视频| 97久久精品人人澡人人爽缅北| 国产精品日日摸夜夜添夜夜av| 国产经典一区二区| 日韩一区二区久久久| 亚洲一区中文字幕| 国产午夜精品久久久| 中文字幕久久亚洲| 久久亚洲精品一区| 久久精品美女视频网站| 亚洲欧美资源在线| 亚洲国产成人久久综合一区| 国产精品扒开腿做爽爽爽男男| 久久国产天堂福利天堂| 国产精品久久久久久久久免费看| 亚洲美女久久久| 色偷偷88888欧美精品久久久| 欧美成人午夜免费视在线看片| 97国产在线观看| 亚洲精品综合精品自拍| 色综合五月天导航| 亚洲精品日韩在线| 久久这里有精品| 精品无人区乱码1区2区3区在线| 亚洲视频欧洲视频| 久久精品国产免费观看| 亚洲综合中文字幕在线观看| 成人午夜在线影院| 91影院在线免费观看视频| 欧美性受xxxx白人性爽| 宅男66日本亚洲欧美视频| 九九热这里只有精品免费看| 国产精品自拍偷拍| 欧美一区二区大胆人体摄影专业网站| 26uuu亚洲国产精品| 97精品国产aⅴ7777| 2021久久精品国产99国产精品| 国产性猛交xxxx免费看久久| 中文字幕亚洲欧美日韩在线不卡| 亚洲一区二区在线播放| 日韩在线观看免费高清完整版| 日韩av在线影视| 国产黑人绿帽在线第一区| 欧美精品在线视频观看| 久久久人成影片一区二区三区| 国产精品免费网站| 国产成人精品一区二区在线|