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

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            為什么虛函數(shù)必須是非靜態(tài)成員函數(shù) 構(gòu)造函數(shù)能為static嗎?

            靜態(tài)函數(shù)
            static聲明的函數(shù)是靜態(tài)函數(shù)。靜態(tài)函數(shù)可以分為全局靜態(tài)函數(shù)類的靜態(tài)成員函數(shù)

            Static
            關(guān)鍵字
            在類中,用static聲明的成員變量為靜態(tài)成員變量,它為該類的公用變量,在第一次使用時(shí)被初始化對(duì)于該類的所有對(duì)象來(lái)說(shuō),static成員變量只有一份。
            static聲明的方法是靜態(tài)方法,在調(diào)用該方法時(shí),不會(huì)將對(duì)象的引用傳遞給它,所以static方法中不可訪問(wèn)非static的成員。
            靜態(tài)方法不再是針對(duì)于某個(gè)對(duì)象調(diào)用,所以不能訪問(wèn)非靜態(tài)成員。
            可以通過(guò)對(duì)象引用或類名(不需要實(shí)例化)訪問(wèn)靜態(tài)成員

            C++
            類靜態(tài)數(shù)據(jù)成員與類靜態(tài)成員函數(shù)
            函數(shù)調(diào)用的結(jié)果不會(huì)訪問(wèn)或者修改任何對(duì)象(非static)數(shù)據(jù)成員,這樣的成員聲明為靜態(tài)成員函數(shù)比較好。且如果static int func(....)不是出現(xiàn)在類中,則它不是一個(gè)靜態(tài)成員函數(shù),只是一個(gè)普通的全局函數(shù),只不過(guò)由于static的限制,它只能在文件所在的編譯單位內(nèi)使用,不能在其它編譯單位內(nèi)使用。
            靜態(tài)成員函數(shù)的聲明除了在類體的函數(shù)聲明前加上關(guān)鍵字static,以及不能聲明為const或者volatile之外,與非靜態(tài)成員函數(shù)相同。出現(xiàn)在類體之外的函數(shù)定義不能制定關(guān)鍵字static。
            靜態(tài)成員函數(shù)沒(méi)有this指針。

            在沒(méi)有講述本章內(nèi)容之前如果我們想要在一個(gè)范圍內(nèi)共享某一個(gè)數(shù)據(jù),那么我們會(huì)設(shè)立全局對(duì)象,但面向?qū)ο蟮某绦蚴怯蓪?duì)象構(gòu)成的,我們?nèi)绾尾拍茉陬惙秶鷥?nèi)共享數(shù)據(jù)呢?

            這個(gè)問(wèn)題便是本章的重點(diǎn):聲明為static的類成員或者成員函數(shù)便能在類的范圍內(nèi)共同享,我們把這樣的成員稱做靜態(tài)成員和靜態(tài)成員函數(shù)。

            下面我們用幾個(gè)實(shí)例來(lái)說(shuō)明這個(gè)問(wèn)題,類的成員需要保護(hù),通常情況下為了不違背類的封裝特性,我們是把類成員設(shè)置為protected(保護(hù)狀態(tài))的,但是我們?yōu)榱撕?jiǎn)化代碼,使要說(shuō)明的問(wèn)題更為直觀,更容易理解,我們?cè)诖颂幎荚O(shè)置為public。

            以下程序我們來(lái)做一個(gè)模擬訪問(wèn)的例子,在程序中,每建立一個(gè)對(duì)象我們?cè)O(shè)置的類靜態(tài)成員變自動(dòng)加一,代碼如下:

            #include <iostream>
            using namespace std;

            class Internet
            {
            public:
                 Internet(char *name,char *address)
                 {
                     strcpy(Internet::name,name);
                     strcpy(Internet::address,address);
                     count++;
                 }


                 static void Internet::Sc()//
            靜態(tài)成員函數(shù)
                 {
                     cout<<count<<endl;
                 }

                 Internet &Rq();


            public:
                 char name[20];
                 char address[20];
                 static int count;//
            這里如果寫成static int count=0;就是錯(cuò)誤的
            };

            Internet& Internet::Rq()//
            返回引用的成員函數(shù)
            {
                 return *this;
            }

            int Internet::count = 0;//
            靜態(tài)成員的初始化

            void vist()
            {
                 Internet a1("
            中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室","www.cndev-lab.com");
                 Internet a2("
            中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室","www.cndev-lab.com");
            }


            void fn(Internet &s)
            {
                 cout<<s.Rq().count;
            }


            void main()
            {
                 cout<<Internet::count<<endl;//
            靜態(tài)成員值的輸出
                 vist();
                 Internet::Sc();//
            靜態(tài)成員函數(shù)的調(diào)用
                 Internet b("
            中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室","www.cndev-lab.com");
                 Internet::Sc();
                 fn(b);
                 cin.get();
            }

            上面代碼我們用了幾種常用的方式建立對(duì)象,當(dāng)建立新對(duì)象并調(diào)用其構(gòu)造函數(shù)的時(shí)候,靜態(tài)成員cout便運(yùn)行加1操作,靜態(tài)成員的初始化應(yīng)該在主函數(shù)調(diào)用之前,并且不能在類的聲明中出現(xiàn),通過(guò)運(yùn)行過(guò)程的觀察我們發(fā)現(xiàn),靜態(tài)成員count的狀態(tài)并不會(huì)隨著一個(gè)新的對(duì)象的新建而重新定義,盡而我們了解到類的靜態(tài)成員是屬于類的而不是屬于哪一個(gè)對(duì)象的,所以靜態(tài)成員的使用應(yīng)該是類名稱加域區(qū)分符加成員名稱的,在上面的代碼中就是Internet::count,雖然我們?nèi)匀豢梢允褂脤?duì)象名加點(diǎn)操作符號(hào)加成員名稱的方式使用,但是不推薦的,靜態(tài)類成員的特性就是屬于類而不專屬于某一個(gè)對(duì)象。

            靜態(tài)成員函數(shù)的特性類似于靜態(tài)成員的使用,同樣與對(duì)象無(wú)關(guān),調(diào)用方法為類名稱加域區(qū)分符加成員函數(shù)名稱,在上面的代碼中就是Internet::Sc();靜態(tài)成員函數(shù)由于與對(duì)象無(wú)關(guān)系,所以在其中是不能對(duì)類的普通成員進(jìn)行直接操作的。

            如果上面的 static void Internet::Sc()修改成為:
            static void Internet::Sc()//
            靜態(tài)成員函數(shù)
            {
                cout<<name<<endl;//
            錯(cuò)誤
                 cout<<count<<endl;
            }


            靜態(tài)成員函數(shù)與普通成員函數(shù)的差別就在于缺少this指針,沒(méi)有這個(gè)this指針自然也就無(wú)從知道name是哪一個(gè)對(duì)象的成員了。

            根據(jù)類靜態(tài)成員的特性我們可以簡(jiǎn)單歸納出幾點(diǎn),靜態(tài)成員的使用范圍:
            1.
            用來(lái)保存對(duì)象的個(gè)數(shù)。
            2.
            作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開(kāi)狀態(tài),打印機(jī)的使用狀態(tài),等等。
            3.
            存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。

            為了做一些必要的練習(xí),深入的掌握靜態(tài)對(duì)象的存在的意義,我們以前面的結(jié)構(gòu)體的教程為基礎(chǔ),用類的方式描述一個(gè)線性鏈表,用于存儲(chǔ)若干學(xué)生的姓名,代碼如下:

            #include <iostream>
            using namespace std;

            class Student
            {
            public:
                 Student (char *name);
                 ~Student();

            public:
                 char name[30];
                 Student *next;
                 static Student *point;
            };

            Student::Student(char *name)
            {
                 strcpy(Student::name,name);
                 this->next=point;
                 point=this;
            }

            Student::~Student ()//
            析構(gòu)過(guò)程就是節(jié)點(diǎn)的脫離過(guò)程
            {
                 cout<<"
            析構(gòu):"<<name<<endl;

                 if(point==this)
                 {
                     point=this->next;
                     cin.get();
                     return;
                 }

                 for(Student *ps=point;ps;ps=ps->next)
                 {
                     if(ps->next==this)
                     {
                     cout<<ps->next<<""<<this->next<<endl;
                     ps->next=next;//=next
            也可以寫成this->next;
                     cin.get();
                     return;
                     }
                 }

                 cin.get();
            }

            Student* Student::point=NULL;
            void main()
            {
                 Student *c = new Student("marry");
                 Student a("colin");
                 Student b("jamesji");
                 delete c;
                 Student *fp=Student::point;
                 while(fp!=NULL)
                 {
                     cout<<fp->name<<endl;
                     fp=fp->next;
                 }

                 cin.get();
            }


            從上面的代碼來(lái)看,原來(lái)單純結(jié)構(gòu)化編程需要的一個(gè)鏈表進(jìn)入全局指針在這里被類的靜態(tài)成員指針?biāo)娲?span lang="EN-US">(
            類的靜態(tài)成員完全可以替代全局變量),這個(gè)例子的理解重點(diǎn)主要是要注意觀察類成員的析構(gòu)順序,通過(guò)對(duì)析構(gòu)順序的理解,使用析構(gòu)函數(shù)來(lái)進(jìn)行節(jié)點(diǎn)的脫鏈操作。

            為什么虛函數(shù)必須是非靜態(tài)成員函數(shù)
            如果定義為虛函數(shù),那么它就是動(dòng)態(tài)綁定的,也就是在派生類中可以被覆蓋的,這與靜態(tài)成員函數(shù)的定義本身就是相矛盾的。

            ==
            主要有兩個(gè)作用:
                 1
            、管理靜態(tài)數(shù)據(jù)成員;
                 2
            、提供類范圍的功能,即不需要對(duì)象來(lái)實(shí)現(xiàn)的功能。
            比如Symbian中的NewL/LC方法就是static

            ==
            使用static關(guān)鍵字聲明的函數(shù)成員是靜態(tài)的,靜態(tài)成員函數(shù)同樣也屬于整個(gè)類,由同一個(gè)類的所有對(duì)象共同維護(hù),為這些對(duì)象所共享。

            作為成員函數(shù),它的訪問(wèn)屬性可以受到類的嚴(yán)格控制,對(duì)于公有的靜態(tài)函數(shù)成員函數(shù),可以通過(guò)類名或?qū)ο竺麃?lái)調(diào)用,但一般情況下建議用對(duì)象名來(lái)引用靜態(tài)函數(shù)成員(真的嗎?)。注意,一般的成員函數(shù)只能通過(guò)對(duì)象名來(lái)調(diào)用。
            由于一個(gè)類的靜態(tài)成員函數(shù)只有一個(gè)拷貝,因此它訪問(wèn)對(duì)象的數(shù)據(jù)何函數(shù)使受到了限制。靜態(tài)成員函數(shù)可以直接訪問(wèn)該類的靜態(tài)數(shù)據(jù)成員。而訪問(wèn)非靜態(tài)數(shù)據(jù)成員,必須通過(guò)參數(shù)傳遞方式得到對(duì)象名,然后通過(guò)對(duì)象名來(lái)訪問(wèn)??梢钥吹剑ㄟ^(guò)靜態(tài)函數(shù)成員訪問(wèn)非靜態(tài)成員使相當(dāng)麻煩的,一般的使用中,它主要用來(lái)訪問(wèn)全局變量或同一個(gè)類中的靜態(tài)數(shù)據(jù)成員,特別是和后者一起使用,達(dá)到對(duì)同一個(gè)類中對(duì)象之間共享的數(shù)據(jù)進(jìn)行維護(hù)的目的。
            構(gòu)造函數(shù)不可以定義為static,看了上面,應(yīng)該可以理解原因。

            注意,由于static不是函數(shù)類型中的一部分,所以在類定義之外定義靜態(tài)成員函數(shù)時(shí)不使用static,在類中定義的靜態(tài)成員函數(shù)是內(nèi)聯(lián)的。

            一般來(lái)說(shuō),通過(guò)成員名限定比使用對(duì)象名訪問(wèn)靜態(tài)成員要好。因?yàn)殪o態(tài)成員不是對(duì)象的成員。

            靜態(tài)成員可以被繼承,這時(shí),基類對(duì)象和派生類的對(duì)象共享該靜態(tài)成員,除此之外,在類等級(jí)中對(duì)靜態(tài)成員的其他特性(例如,靜態(tài)成員在派生類中的訪問(wèn)權(quán)限,在派生類中重載成員函數(shù)等)的分析與一般成員類似。

            靜態(tài)成員函數(shù)不能被申明為虛函數(shù),靜態(tài)成員具有外部連接屬性,static僅有的含義是使該成員為該類的所有對(duì)象共享。

            類中的任何成員函數(shù)都可以訪問(wèn)靜態(tài)成員,但靜態(tài)成員函數(shù)只能通過(guò)對(duì)象名(或指向?qū)ο蟮闹羔槪┰L問(wèn)該對(duì)象的非靜態(tài)成員,因?yàn)殪o態(tài)成員函數(shù)沒(méi)有this 指針。


            虛函數(shù)必須是非靜態(tài)成員函數(shù)

            構(gòu)造函數(shù)不可以定義為static

            posted on 2009-08-19 13:25 肥仔 閱讀(1805) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

            国产成人精品久久免费动漫| 国产福利电影一区二区三区久久老子无码午夜伦不 | 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久妇女高潮几次MBA| 日本欧美久久久久免费播放网| 色综合久久无码五十路人妻| 精品无码久久久久久尤物| 91久久香蕉国产熟女线看| 久久免费视频一区| 亚洲欧美日韩中文久久| 97精品久久天干天天天按摩 | 青青草原综合久久大伊人精品| 香港aa三级久久三级| 香蕉久久影院| 国产成人精品免费久久久久| 久久精品国产一区二区三区 | 无码国内精品久久综合88| 亚洲精品美女久久久久99| 99久久精品九九亚洲精品| 国产精品一区二区久久精品涩爱| 国产产无码乱码精品久久鸭| 欧美精品福利视频一区二区三区久久久精品| 色综合久久中文字幕无码| 久久人人爽人人爽人人片AV麻豆| 久久精品aⅴ无码中文字字幕不卡| 精品永久久福利一区二区| 久久精品国产亚洲AV蜜臀色欲| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | www.久久99| 亚洲狠狠婷婷综合久久蜜芽 | 亚洲国产成人久久笫一页| 久久免费美女视频| 久久久精品人妻一区二区三区蜜桃 | 99久久综合狠狠综合久久止| 成人综合久久精品色婷婷| 久久久久亚洲精品无码网址| 1000部精品久久久久久久久| 天堂久久天堂AV色综合| 少妇内射兰兰久久| avtt天堂网久久精品| 久久精品一区二区|