• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0

            原文地址:http://blog.csdn.net/yiyunoo/archive/2008/05/16/2452363.aspx

            c++構(gòu)造函數(shù)后面的冒號
            初始化列表,跟在{}里面的初始化沒有什么不同,但在非靜態(tài)const類型以及引用型成員變量必須在初始化列表里面初始化,不能在{}里面初始化.A(b)就是用父類的構(gòu)造函數(shù)進(jìn)行一部分初始化.
            --------------

            很多的人對中構(gòu)造函數(shù)寢初始化很多的困惑,對冒號后初始化不是太明白,總搞不清楚它們之間的區(qū)別,我想把我對這個問題的理解和看法和大家討論討論。

               在程序中定義變量并初始化的機(jī)制中,有兩種形式,一個是我們傳統(tǒng)的初始化的形式,即賦值運(yùn)算符賦值,還有一種是括號賦值,如:
               int a=10;
               char b='r';\\賦值運(yùn)算符賦值
              int a(10);\
               char b('r');\\括號賦值
            以上定義并初始化的形式是正確的,可以通過編譯,但括號賦值只能在變量定義并初始化中,不能用在變量定義后再賦值,這是和賦值運(yùn)算符賦值的不同之處,如:
               (1)
               int a;  \\先定義一個變量
               ......
               a=10;  \\根據(jù)需要賦值

               (2)
               int b;   \\先定義一個變量
               ......
               b(10);  \\和(1)一樣根據(jù)需要賦值
            (1)是可以用通過編譯,定義一個變量a但并沒有初始化,在需要變量a的時候,通過賦值運(yùn)算符把10賦給a,而在(2)中,是通過括號把10賦值給b,但編譯系統(tǒng)認(rèn)為
            這是一個函數(shù)的調(diào)用,函數(shù)名為b,10為實(shí)際參數(shù),所以編譯錯誤。因此,括號賦值只用在定義變量并初始化中。 
                現(xiàn)在我們來看構(gòu)造函數(shù)中冒號初始化和函數(shù)初始化的問題,類構(gòu)造函數(shù)的作用是創(chuàng)建一個類的對象時,調(diào)用它來構(gòu)造這個類對象的數(shù)據(jù)成員,一要給出此數(shù)據(jù)成員分配內(nèi)存空間,二是要給函數(shù)數(shù)據(jù)成員初始化,構(gòu)造數(shù)據(jù)成員是按數(shù)據(jù)成員在類中聲明的順序進(jìn)行構(gòu)造。

                冒號初始化與函數(shù)體初始化的區(qū)別在于:

               冒號初始化是給數(shù)據(jù)成員分配內(nèi)存空間時就進(jìn)行初始化,就是說分配一個數(shù)據(jù)成員只要冒號后有此數(shù)據(jù)成員的賦值表達(dá)式(此表達(dá)式必須是括號賦值表達(dá)式),那么分配了內(nèi)存空間后在進(jìn)入函數(shù)體之前給數(shù)據(jù)成員賦值,就是說初始化這個數(shù)據(jù)成員此時函數(shù)體還未執(zhí)行。

                對于在函數(shù)中初始化,是在所有的數(shù)據(jù)成員被分配內(nèi)存空間后才進(jìn)行的。

               這樣是有好處的,有的數(shù)據(jù)成員需要在構(gòu)造函數(shù)調(diào)入之后函數(shù)體執(zhí)行之前就進(jìn)行初始化如引用數(shù)據(jù)成員,常量數(shù)據(jù)成員對象數(shù)據(jù)成員,看下面的一段程序:
               class student
               {public :

                 student ()
                  .
                  .
                  .
                 protected:
                 const int a;
                 int &b; 
               }

               student ::student (int i,int j)
              {
                 a=i;
                 b=j;
               }

            在Student類中有兩個數(shù)據(jù)成員,一個是常量數(shù)據(jù)成員,一個是引用數(shù)據(jù)成員,并且在構(gòu)造函數(shù)中初始化了這兩個數(shù)據(jù)成員,但是這并不能通過編譯,因?yàn)槌A砍跏蓟瘯r必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用后,它就和引用的目標(biāo)維系在了一起,也是不能再被賦值的。所以C ++":"后初始化的機(jī)制,使引用和常量數(shù)據(jù)成員變?yōu)榭赡艿模琒tudent類的構(gòu)造函數(shù)應(yīng)為:
                student ::student(int i,int j):a(i),b(j){}

            在下面的程序:
                class teach
               { 
                public :
                  teach(char *p="name",int a=0)
                       .         .
                       .
                protected:
                  char name[30];
                  int age;
               }
               teach ::teach(char*p,int a)
               {
                strcopy(name ,p);
                age=a;    
                     cout>>name>>endl;
               }
               class student
              {
                public:
                 student (char *p="name");
                       .
                       .
                       .
                protected;
                 char name[30];
                 teach teacher;
               };
               student::student(char *p)
               {
                 strcopy(name,p);
                 cont>>name>>endl;
               }
            在上面的程序中通不過編譯,編譯系統(tǒng)會告訴你teacher這個類對象缺默認(rèn)構(gòu)造函數(shù),因?yàn)樵趖each 類中沒有定義默認(rèn)的構(gòu)造函數(shù)。那么帶參數(shù)的構(gòu)造函數(shù)怎么進(jìn)行構(gòu)造呢?通過我們前面提到的冒號賦值。那它的構(gòu)造函數(shù)應(yīng)該是:
               
               student::student(char *p,char *pl,int ag):teacher(pl,ag)
               {
                 strcopy(name,p);
                 cont>>name>>endl;
               }
            就是說在沒有默認(rèn)構(gòu)造函數(shù)的時候,如果一個類對象是另一個類的數(shù)據(jù)成員,那么初始化這個數(shù)據(jù)成員,就應(yīng)該放到冒號后面。這樣可以帶參數(shù)。在類的定義中,如: 
                 protected;
                 char name[30];
                 teach teacher
            類對象是不能帶參數(shù)的,因?yàn)樗皇锹暶鳌?

                所以在C++中就增加了這種機(jī)制,這是面向?qū)ο缶幊趟仨毜?。不知道我講明白沒有。如不明白請查閱有關(guān)資料

            posted on 2011-02-14 21:40 luis 閱讀(7320) 評論(2)  編輯 收藏 引用

            FeedBack:
            # re: C++構(gòu)造函數(shù)中的初始化:C++構(gòu)造函數(shù)后面的冒號
            2013-01-23 02:25 | 老岳
            講的非常好。很有條例,也很簡潔。贊!  回復(fù)  更多評論
              
            # re: C++構(gòu)造函數(shù)中的初始化:C++構(gòu)造函數(shù)后面的冒號[未登錄]
            2013-10-04 20:10 | summer
            最后學(xué)生老師那段代碼是可以編譯通過運(yùn)行的啊,文中的代碼你都嘗試編譯過了嗎?  回復(fù)  更多評論
              
            <2012年2月>
            2930311234
            567891011
            12131415161718
            19202122232425
            26272829123
            45678910

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲伊人久久成综合人影院 | 国产精品岛国久久久久| 人妻丰满AV无码久久不卡| 囯产精品久久久久久久久蜜桃| 久久一日本道色综合久久| 精品久久久久久| 久久青青草原亚洲av无码| 久久久久亚洲AV成人片 | 久久er热视频在这里精品| 久久久久无码国产精品不卡| 国产精品美女久久久久网| 亚洲国产欧洲综合997久久| 国产成人精品久久| 丁香五月网久久综合| 91久久精品国产成人久久| 四虎国产精品免费久久| 精品国产99久久久久久麻豆| 99久久er这里只有精品18| 国产ww久久久久久久久久| 亚洲国产小视频精品久久久三级| 热99RE久久精品这里都是精品免费 | 久久人人爽人人爽人人av东京热| 久久精品国产亚洲AV大全| 亚洲国产精品无码久久SM| 精品久久人妻av中文字幕| 久久99热这里只有精品国产| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 久久天天躁狠狠躁夜夜不卡| 日日躁夜夜躁狠狠久久AV| 国产日韩欧美久久| 国内精品久久久久久99| 亚洲精品成人久久久| 久久久久久国产精品无码超碰| 久久久中文字幕日本| 精品久久久噜噜噜久久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 国产精品gz久久久| 久久久久九国产精品| 国产精品欧美久久久久无广告| 亚洲va久久久噜噜噜久久| 亚洲精品久久久www|