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

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

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

2020-05-23 13:58:48
字體:
來源:轉載
供稿:網友

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
成人久久18免费网站图片| 亚洲一区二区三区视频| 欧美大片va欧美在线播放| 欧美成人免费小视频| 久久久久久尹人网香蕉| 日韩欧美在线观看视频| 精品精品国产国产自在线| 日韩激情av在线播放| 国产精品久久久久久久久| 国内精品久久久久久中文字幕| 一本色道久久综合亚洲精品小说| 欧美国产日韩一区二区三区| 中文字幕国产日韩| 成人做爰www免费看视频网站| 午夜精品国产精品大乳美女| 91午夜理伦私人影院| 成人黄在线观看| 亚洲福利在线视频| 韩国欧美亚洲国产| 久久免费视频观看| 国产在线视频91| 成人黄色片网站| 爱福利视频一区| 91九色国产社区在线观看| 欧美黑人性生活视频| 成人国产精品一区二区| 国产精品久久久久久搜索| 91视频8mav| 最近2019免费中文字幕视频三| 精品视频9999| 一区二区三区高清国产| 亚洲a∨日韩av高清在线观看| 久久影院中文字幕| 欧美大学生性色视频| 日韩中文字在线| 中文字幕日韩精品在线| 久久久电影免费观看完整版| 欧日韩在线观看| 亚洲第一网站男人都懂| 91亚洲国产精品| 亚洲美女又黄又爽在线观看| 亚洲国产精品久久久| 九色91av视频| 欧美大片免费看| 亚洲www视频| 日韩美女av在线| 萌白酱国产一区二区| 日韩av在线播放资源| 国产一区二区三区中文| 欧美日韩国产在线播放| 黄色成人av在线| 亚洲色图25p| 欧美日本亚洲视频| 亚洲乱码国产乱码精品精| 欧美国产日韩xxxxx| 米奇精品一区二区三区在线观看| 国产精品久久9| 亚洲无限乱码一二三四麻| 日本国产欧美一区二区三区| 91国内在线视频| 亚洲国产精品热久久| 日本免费一区二区三区视频观看| 欧美在线播放视频| 亚洲精品综合精品自拍| 久久精品视频播放| 欧美最猛性xxxx| 国外成人免费在线播放| 国产成人精彩在线视频九色| 久久久久久久999| 亚洲香蕉在线观看| 国产成人精品亚洲精品| 日韩毛片在线看| 欧美激情中文字幕乱码免费| 国模吧一区二区三区| 亚洲精品综合精品自拍| 美女av一区二区| 色视频www在线播放国产成人| 国产精品久久av| 亚洲视频国产视频| 欧美与黑人午夜性猛交久久久| 日韩精品视频免费在线观看| 欧美猛交免费看| 久久综合久久八八| 国产精品99久久99久久久二8| 在线日韩av观看| 色综合久久88色综合天天看泰| 蜜月aⅴ免费一区二区三区| 大伊人狠狠躁夜夜躁av一区| 国产日韩精品在线播放| 欧美国产日本高清在线| 日韩毛片在线看| 国产精品美女网站| 欧美成年人视频网站欧美| 成人中文字幕+乱码+中文字幕| 日韩精品在线视频| 成人h视频在线| 欧美激情网站在线观看| 91国偷自产一区二区三区的观看方式| 国外成人性视频| 国产精品18久久久久久首页狼| 国产成人亚洲综合| 欧美三级欧美成人高清www| 欧美另类老肥妇| 欧美xxxx18性欧美| 国产成人精品av| 亚洲图片欧洲图片av| 色综合男人天堂| 久久久久久999| 国产美女久久精品香蕉69| 日韩av中文字幕在线| 欧美夜福利tv在线| 国产精品免费一区豆花| 国产日韩视频在线观看| 亚洲人成网站777色婷婷| 国产精品偷伦免费视频观看的| 91精品久久久久久久久中文字幕| 亚洲第一在线视频| 欧美老女人在线视频| 91精品国产乱码久久久久久蜜臀| 亚洲已满18点击进入在线看片| 在线播放日韩欧美| 亚洲男人天堂网站| 久久久亚洲福利精品午夜| 亚洲国产精品va在线看黑人| 国产精品欧美日韩| 欧美性在线视频| 精品日本高清在线播放| 国产精品黄色av| 免费91麻豆精品国产自产在线观看| 红桃视频成人在线观看| 精品中文视频在线| 中文字幕不卡在线视频极品| 97久久精品人搡人人玩| 国产精品高精视频免费| 欧美一区二区三区免费视| 久久网福利资源网站| 91高清免费视频| 久久综合免费视频影院| 欧美成人免费网| 国产一区二区三区毛片| 亚洲精品网站在线播放gif| 久久久国产精品亚洲一区| 精品亚洲一区二区三区在线观看| 中文字幕亚洲一区在线观看| 亚洲免费视频观看| 亚洲精品福利在线观看| 久久久免费在线观看| 国产精品日日做人人爱| 色偷偷av一区二区三区乱| 久久网福利资源网站| 国产成人极品视频| 日韩免费在线电影| 亚洲精品国精品久久99热| 亚洲欧美日韩精品久久| 久久久久国产视频| 欧美精品在线免费| 成人羞羞国产免费| 久久色免费在线视频| 日韩av快播网址| 91精品在线国产| 中文字幕国产精品| 成人性生交大片免费看小说| 日韩一区二区三区国产| 国产精品电影网|