• <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>

            幽魂國度

             

            構(gòu)造函數(shù)簡介

            目的:為了使用戶定義的數(shù)據(jù)類型如同一般數(shù)據(jù)類型一樣使用。
            功能:對(duì)對(duì)象進(jìn)行初始化,有若干種方法。
            特點(diǎn):1、無返回值說明;2、不能繼承;3、可以有缺省參數(shù);4、不能取地址,構(gòu)造時(shí)自動(dòng)給對(duì)象分配棧中內(nèi)存,析構(gòu)時(shí)回收;
                        5、自動(dòng)調(diào)用構(gòu)造函數(shù)。
                    構(gòu)造函數(shù)是類的一個(gè)特殊成員函數(shù),其函數(shù)名同類名一樣。C++通過構(gòu)造函數(shù)可以正確地初始化對(duì)象。構(gòu)造函數(shù)不能被顯式調(diào)用,不能使
            虛函數(shù)。
            例: class queue {
                                     int q[100];              //默認(rèn)為private
                                     int sloc,rloc;
                                  public:
                                     queue();
                                     void qput(int i); 
            };
            queue ::queue ()          //隱式調(diào)用
            {
                    sloc=rloc=0;
            }        
            int    queue ::qput (int i){}
            main()
            {
                  queue  a,b;
                  a.qput (10); 
                  b.qput (20); 
            }
                  參數(shù)化的構(gòu)造函數(shù)
            queue ::queue (int vx,int vy){} };
            main()
            {
                queue  a(10,20);
            }
                  缺省參數(shù)的構(gòu)造函數(shù):特殊情況下需要傳遞參數(shù),一般都是用缺省參數(shù)。
            單個(gè)參數(shù):queue ::queue (int i=16) {}   };
                                main()
                                  {
                                         queue  a;
                                   }
            多個(gè)參數(shù):queue ::queue (int vx=0,int vy=0) {}
            缺省參數(shù)還可用于一般成員函數(shù)。使用時(shí)應(yīng)注意避免二義性。
                  多構(gòu)造函數(shù)
            public:
                    queue ( );
                    queue (int );
                    queue (int,char );
            };
            main()
            {
                     queue a;
                     queue b(1);
                     queue c(1,'c');    //避免二義性
            }
                   拷貝構(gòu)造函數(shù)
            1、系統(tǒng)產(chǎn)生:
            queue ::queue (int vx,int vy){}   };
              main() { queue a(b) ; }
            2、自定義:
            queue ::queue (const queue &p){}  };
             main()  { queue }

            總結(jié):構(gòu)造函數(shù)的作用是對(duì)對(duì)象本身做初始化工作,也就是給用戶提供初始化類中成員變量的一種方式。
                      如果一個(gè)類中沒有定義任何的構(gòu)造函數(shù),那C++編輯器將在某些情況下提供一個(gè)默認(rèn)的構(gòu)造函數(shù)(不帶參數(shù)),3種情況:
                1)、類有虛擬成員函數(shù)或虛擬繼承父類(虛擬基類);
                2)、類的基類有構(gòu)造函數(shù);
                3)、類中的所有非靜態(tài)餓對(duì)象數(shù)據(jù)成員,它們所屬的類中有構(gòu)造函數(shù)。

            構(gòu)造函數(shù)的目的是為了初始化對(duì)象,因此一個(gè)構(gòu)造函數(shù)至少應(yīng)該使得對(duì)象處于明確定義的狀態(tài)
            例://class string
            string () {s=new char[80];len=80;}
            string (int n) {s=new char[n];len=n;}
            }
            string::stringprintf() { cout<< s <<endl;}
            定義對(duì)象:
            string x,y(80);
            x.print();
            y.print();
            此時(shí),x和y調(diào)用的print()函數(shù)結(jié)構(gòu)未定義,因?yàn)樵跇?gòu)造函數(shù)中只對(duì)字符數(shù)組分配了內(nèi)存,卻未對(duì)分配的內(nèi)存進(jìn)行初始化。
            我們可以通過修改帶默認(rèn)參數(shù)值的構(gòu)造函數(shù)來改進(jìn):
            string (int n=80) {s=new char[n];s[0]='\0';len=n;}
             用默認(rèn)參數(shù)的形式來代替函數(shù)重載的形式。

            注意點(diǎn):
            1)構(gòu)造函數(shù)應(yīng)該使對(duì)象處于明確定義的狀態(tài);
            2)保持物理狀態(tài)的一致性:對(duì)數(shù)據(jù)成員的定義保持一致,在所有函數(shù)中只能使用一種定義。
            3)類不變性:可以將不變性作為程序代碼的注釋,//len=strlen(s);
            4)動(dòng)態(tài)內(nèi)存的一致性:接口一致性
                 void assign (char* str) { strcpy(s,str);}
                 void concat (string& a) {s=new char[len+1];strcpy(s,a.s);}
                 兩函數(shù)的表現(xiàn)行為存在不一致性:前者內(nèi)存不再分配,而后者一直在分配。我們應(yīng)只使用一種以保持一致性。
            5)內(nèi)存泄露:concat函數(shù)中每拷貝一次,s就重新分配一次,s被新的指針值覆蓋,而前一指針值被拋棄,產(chǎn)生內(nèi)存垃圾。
                  因此concat函數(shù)必須保證舊的數(shù)組一定要被刪除,對(duì)于每一個(gè)new,就必須有一個(gè)delete操作,且delete語句只能被增加在
                  新的字符串創(chuàng)建之后。
                  void concat (string& a) {new_s=new char[len+1];strcpy(s,a.s); delete[]s;s=new_s;}

            posted on 2009-11-10 15:49 閱讀(441) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            2020最新久久久视精品爱| 最新久久免费视频| 国产精品日韩深夜福利久久| 久久99精品久久久久久秒播| 久久久久久曰本AV免费免费| 久久国产精品99国产精| 久久精品视屏| 久久99国产乱子伦精品免费| 久久无码国产| 国产精品久久久久国产A级| 99久久国产综合精品网成人影院| 伊人热热久久原色播放www | 国产精品无码久久久久| 2019久久久高清456| 久久香蕉国产线看观看99| 漂亮人妻被中出中文字幕久久| 久久精品国产免费一区| 久久精品国产日本波多野结衣 | 香蕉aa三级久久毛片| 91久久精一区二区三区大全| 97视频久久久| 亚洲七七久久精品中文国产| 久久亚洲综合色一区二区三区| 中文字幕人妻色偷偷久久| 偷窥少妇久久久久久久久| 国产精品无码久久综合网| 久久中文娱乐网| 国产一区二区精品久久| 久久99国产精品一区二区| 99久久久精品| 国产精品99久久久久久人| 久久久久免费看成人影片| 午夜天堂av天堂久久久| 无码任你躁久久久久久老妇App| 色婷婷综合久久久久中文字幕| 看全色黄大色大片免费久久久| 狠狠精品久久久无码中文字幕| A级毛片无码久久精品免费| 久久黄视频| 久久精品人人做人人爽电影| 免费精品久久久久久中文字幕|