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

            C++之父力作學(xué)習(xí)筆記(4)——類的好多事

                  類,這個(gè)概念比較大。包含的事太多。咱們就一一的盡量弄清楚它。
                  一個(gè)類就是一個(gè)用戶定義類型。C++里類概念的目標(biāo)就是為程序員提供一種建立新類型的工具,是這些新類型的使用能夠像內(nèi)部一樣方便。
                  訪問控制:class成員的默認(rèn)訪問方式是私有的。一個(gè)struct也是一個(gè)class,但是其成員的默認(rèn)方式是公用的。非成員函數(shù)禁止訪問私有成員。
                  構(gòu)造函數(shù):就是函數(shù)名和類名一樣的函數(shù)且沒有返回值。這誰都知道。It's easy。而默認(rèn)構(gòu)造函數(shù)就是調(diào)用時(shí)不必提供參數(shù)的構(gòu)造函數(shù)。如果用戶自己聲明了一個(gè)默認(rèn)構(gòu)造函數(shù),那么就會(huì)去使用它;否則,如果有必要,而且用戶沒有聲明其他的構(gòu)造函數(shù),編譯器就會(huì)設(shè)法去生成一個(gè)。編譯器生成的默認(rèn)構(gòu)造函數(shù)將隱式地為類類型的成員和它的基類調(diào)用有關(guān)的默認(rèn)構(gòu)造函數(shù)。這里解釋一下:類類型(Class type)即指那些由程序員定義的類而產(chǎn)生的類型,以便與內(nèi)部類型和其他用戶定義類型相區(qū)分。相信大家這里也沒什么問題。有一個(gè)注意點(diǎn)來了,由于const和引用必須進(jìn)行初始化,包含const或引用成員的類就不能進(jìn)行默認(rèn)構(gòu)造,除非程序員的我們自己顯示的提供默認(rèn)構(gòu)造函數(shù)。例如:
            struct X
            {
                
            const int a;
                
            const int& r;
            }
            ;
            X x;
            //錯(cuò)誤;X無默認(rèn)構(gòu)造函數(shù)
                  默認(rèn)構(gòu)造函數(shù)也可以顯示調(diào)用。內(nèi)部類型同樣也有默認(rèn)構(gòu)造函數(shù)。
                  下面再談?wù)剰?fù)制構(gòu)造函數(shù),先看看復(fù)制構(gòu)造函數(shù)是怎么引進(jìn)來的。
            按照默認(rèn)約定,類對(duì)象可以復(fù)制。特別是可以用一個(gè)類的對(duì)象和復(fù)制對(duì)該類的其他對(duì)象進(jìn)行初始化。即使是聲明了構(gòu)造函數(shù)的地方,也是可以這樣做:
            Date d=today;//通過復(fù)制初始化
            按照默認(rèn)方式,類對(duì)象的復(fù)制就是其中各個(gè)成員的復(fù)制。如果某個(gè)類X所需要的不是這種默認(rèn)方式,那么就可以定義一個(gè)復(fù)制構(gòu)造函數(shù)X::X(const X&),由它提供所需要的行為。還有一個(gè)概念就是復(fù)制賦值,很容易和復(fù)制構(gòu)造函數(shù)搞混。咱們就一起搞清楚它們。先看一段程序:
            void h()
            {
                Table t1;
                Table t2
            =t1;//復(fù)制初始化
                Table t3;
                t3
            =t2;      //復(fù)制賦值
            }
            看似好像沒什么問題,對(duì)于復(fù)制上面提到的解釋方式,在應(yīng)用到具有指針成員的類的對(duì)象時(shí),就可能產(chǎn)生一種出人意料的作用。對(duì)于包含了由構(gòu)造函數(shù)/析構(gòu)函數(shù)管理的資源的對(duì)象而言,按成員復(fù)制的語義通常是不正確的。在這里,Table的默認(rèn)構(gòu)造函數(shù)為t1和t3各調(diào)用了一次,一共是兩次。然而Table的析構(gòu)函數(shù)則被調(diào)用了三次;對(duì)t1、t2和t3各一次!由于賦值的默認(rèn)解釋是按成員賦值,所以在h()結(jié)束時(shí),t1、t2和t3中將各包含一個(gè)指針,它們都指向建立t1時(shí)從自由存儲(chǔ)中分配的那個(gè)名字?jǐn)?shù)組。在建立t3時(shí)所分配的數(shù)組的指針并沒有保留下來,因?yàn)樗毁x值t3=t2覆蓋掉了。這樣,如果沒有自動(dòng)廢料收集,對(duì)這個(gè)程序而言,該數(shù)組的存儲(chǔ)就將永遠(yuǎn)丟掉了。而在另一方面,為t1的創(chuàng)建而分配的數(shù)組因?yàn)橥瑫r(shí)出現(xiàn)在t1、t2和t3里,將被刪除3次。這種情況所導(dǎo)致的結(jié)果是無定義,很可能是災(zāi)難性的。這類反常情況可以避免,方式就是將Table復(fù)制的意義定義清楚:
            class Table
            {
                
            //---
                Table(const Table&);//復(fù)制構(gòu)造函數(shù)
                Table& operator=(const Table&);//復(fù)制賦值
            }
            ;
            咱們自己可以為這些復(fù)制操作定義自己認(rèn)為最合適的任何意義,例如
            //這里補(bǔ)上Table類的詳細(xì)定義
            class Table
            {
                Name
            * p;
                size_t sz;
            public:
                Table(size_t s
            =15)
                
            {
                    p
            =new Name[sz=s];
                }

                
            ~Table()
                

                    delete[] p;
                }

                Name
            * loopup(const char*);
                
            bool insert(Name*);
            }


            Table::Table(
            const Table& t)//復(fù)制構(gòu)造函數(shù)
            {
               p
            =new Name[z=t.sz];
               
            for(int i=0;i<sz;i++)
                  p[i]
            =t.p[i];
            }


            Table
            & Table::operator=(const Table& t)//賦值
            {
                
            if(this!=&t)//當(dāng)心自賦值:t=t
                
            {
                    delete[] p;
                    p
            =new Name[sz=t.sz];
                    
            for(int i=0;i<sz;i++)
                        p[i]
            =t.p[i];
                }

                
            return *this;
            }
            情況幾乎總是如此,復(fù)制構(gòu)造函數(shù)與復(fù)制賦值通常都很不一樣。究其根本原因,復(fù)制構(gòu)造函數(shù)是去完成對(duì)為初始化的存儲(chǔ)區(qū)的初始化,而復(fù)制賦值運(yùn)算符則必須正確處理一個(gè)結(jié)構(gòu)良好的對(duì)象。
                  成員常量:
                  對(duì)那些靜態(tài)整型成員,可以給它的成員聲明加上一個(gè)常量表達(dá)式作為初始式,例如
            class Curious
            {
                
            static const int c1=7;//ok,但要記得去定義
                static int c2=11;//錯(cuò)誤:非const
                const int c3;//錯(cuò)誤:非Static
                static const int c4=f(1);//錯(cuò)誤:在類里的初始表達(dá)式不是常量
                static const float c5=7.0;//錯(cuò)誤:在類里初始化的不是整型
            }
            1)在類中不能用const來創(chuàng)建常量!因?yàn)椋侯愔皇敲枋隽藢?duì)象的形式,并沒有真正創(chuàng)建對(duì)象!所以, 在對(duì)象建立之前,并沒有存值空間!
            2)而const是用來創(chuàng)建常量的!
            方法1 你可以用枚舉:
            class a
            {
            enum{buf_size_t buf_size=、、、}//用枚舉創(chuàng)建一個(gè)常量,但不是數(shù)據(jù)成員

            }

            方法2 你可以用static
            class a
            {
            private
              
            static const buf_size_t buf_size=30//該常量將與憋得靜態(tài)常量存儲(chǔ)在一起,而不是存儲(chǔ)在對(duì)象中
            }
            但《C++程序設(shè)計(jì)語言》書上說當(dāng)你用到某個(gè)被初始化的成員,而且需要將它作為對(duì)象存入存儲(chǔ)器時(shí),這個(gè)成員就必須在某處有定義。初始式不必重復(fù)寫:
            const int Curious::c1;//必須,但這里不必重復(fù)初始式
            const int* p=&Cusious::c1;//ok:Curious::c1已經(jīng)有定義
            這里有點(diǎn)讓我懵了,為什么還要const int Curious::c1;//必須,但這里不必重復(fù)初始式 這一行呢?還說是必須,經(jīng)過測試是有問題的——當(dāng)前范圍內(nèi)的定義或重新聲明非法,到底是書錯(cuò)了還是還有其他什么原因?
            還請高手不吝賜教
            今天就到這里吧,到這里就出了問題,還需要思考。

            這里有一篇博文關(guān)于
            VC6.0中,整型const static成員不能在類的定義體中初始化. http://blog.csdn.net/yiruirui0507/article/details/5984530




            posted on 2011-08-05 17:00 Daywei 閱讀(2221) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++之父力作學(xué)習(xí)筆記

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            牛人博客

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久久精品波多野结衣| 欧美久久一级内射wwwwww.| 狠狠综合久久综合88亚洲| 国产69精品久久久久APP下载| 久久精品国产亚洲av麻豆蜜芽 | 久久久久99精品成人片| 久久国产乱子伦精品免费午夜| 亚洲国产精品无码久久青草| 三上悠亚久久精品| 久久久九九有精品国产| 国内精品伊人久久久影院| 国内精品伊人久久久久av一坑| 91秦先生久久久久久久| 久久综合狠狠综合久久综合88| 久久噜噜久久久精品66| 国产精品无码久久综合| 久久久久久久91精品免费观看| 九九99精品久久久久久| 一本色道久久88—综合亚洲精品| 狠狠色婷婷综合天天久久丁香| 久久无码高潮喷水| 一本色道久久88加勒比—综合| 亚洲精品蜜桃久久久久久| 久久久久久国产精品美女 | 亚洲国产天堂久久久久久| 91精品国产9l久久久久| 久久精品人妻中文系列| 日本久久中文字幕| 日本加勒比久久精品| 国産精品久久久久久久| 久久99精品久久久久久齐齐 | 中文字幕无码久久精品青草| 精品国产青草久久久久福利| 色综合久久中文综合网| 国产精品久久久久久福利漫画| 久久99国产精品尤物| av国内精品久久久久影院| 欧美精品久久久久久久自慰| 国产午夜免费高清久久影院 | 亚洲中文精品久久久久久不卡 | 好久久免费视频高清|