青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

為什么虛函數必須是非靜態成員函數 構造函數能為static嗎?

靜態函數
static聲明的函數是靜態函數。靜態函數可以分為全局靜態函數類的靜態成員函數

Static
關鍵字
在類中,用static聲明的成員變量為靜態成員變量,它為該類的公用變量,在第一次使用時被初始化對于該類的所有對象來說,static成員變量只有一份
static聲明的方法是靜態方法,在調用該方法時,不會將對象的引用傳遞給它,所以static方法中不可訪問非static的成員。
靜態方法不再是針對于某個對象調用,所以不能訪問非靜態成員。
可以通過對象引用或類名(不需要實例化)訪問靜態成員

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

在沒有講述本章內容之前如果我們想要在一個范圍內共享某一個數據,那么我們會設立全局對象,但面向對象的程序是由對象構成的,我們如何才能在類范圍內共享數據呢?

這個問題便是本章的重點:聲明為static的類成員或者成員函數便能在類的范圍內共同享,我們把這樣的成員稱做靜態成員和靜態成員函數。

下面我們用幾個實例來說明這個問題,類的成員需要保護,通常情況下為了不違背類的封裝特性,我們是把類成員設置為protected(保護狀態)的,但是我們為了簡化代碼,使要說明的問題更為直觀,更容易理解,我們在此處都設置為public

以下程序我們來做一個模擬訪問的例子,在程序中,每建立一個對象我們設置的類靜態成員變自動加一,代碼如下:

#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()//
靜態成員函數
     {
         cout<<count<<endl;
     }

     Internet &Rq();


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

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

int Internet::count = 0;//
靜態成員的初始化

void vist()
{
     Internet a1("
中國軟件開發實驗室","www.cndev-lab.com");
     Internet a2("
中國軟件開發實驗室","www.cndev-lab.com");
}


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


void main()
{
     cout<<Internet::count<<endl;//
靜態成員值的輸出
     vist();
     Internet::Sc();//
靜態成員函數的調用
     Internet b("
中國軟件開發實驗室","www.cndev-lab.com");
     Internet::Sc();
     fn(b);
     cin.get();
}

上面代碼我們用了幾種常用的方式建立對象,當建立新對象并調用其構造函數的時候,靜態成員cout便運行加1操作,靜態成員的初始化應該在主函數調用之前,并且不能在類的聲明中出現,通過運行過程的觀察我們發現,靜態成員count的狀態并不會隨著一個新的對象的新建而重新定義,盡而我們了解到類的靜態成員是屬于類的而不是屬于哪一個對象的,所以靜態成員的使用應該是類名稱加域區分符加成員名稱的,在上面的代碼中就是Internet::count,雖然我們仍然可以使用對象名加點操作符號加成員名稱的方式使用,但是不推薦的,靜態類成員的特性就是屬于類而不專屬于某一個對象。

靜態成員函數的特性類似于靜態成員的使用,同樣與對象無關,調用方法為類名稱加域區分符加成員函數名稱,在上面的代碼中就是Internet::Sc();靜態成員函數由于與對象無關系,所以在其中是不能對類的普通成員進行直接操作的。

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


靜態成員函數與普通成員函數的差別就在于缺少this指針,沒有這個this指針自然也就無從知道name是哪一個對象的成員了。

根據類靜態成員的特性我們可以簡單歸納出幾點,靜態成員的使用范圍:
1.
用來保存對象的個數。
2.
作為一個標記,標記一些動作是否發生,比如:文件的打開狀態,打印機的使用狀態,等等。
3.
存儲鏈表的第一個或者最后一個成員的內存地址。

為了做一些必要的練習,深入的掌握靜態對象的存在的意義,我們以前面的結構體的教程為基礎,用類的方式描述一個線性鏈表,用于存儲若干學生的姓名,代碼如下:

#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 ()//
析構過程就是節點的脫離過程
{
     cout<<"
析構:"<<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();
}


從上面的代碼來看,原來單純結構化編程需要的一個鏈表進入全局指針在這里被類的靜態成員指針所替代(類的靜態成員完全可以替代全局變量),這個例子的理解重點主要是要注意觀察類成員的析構順序,通過對析構順序的理解,使用析構函數來進行節點的脫鏈操作。

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

==
主要有兩個作用:
     1
、管理靜態數據成員;
     2
、提供類范圍的功能,即不需要對象來實現的功能。
比如Symbian中的NewL/LC方法就是static

==
使用static關鍵字聲明的函數成員是靜態的,靜態成員函數同樣也屬于整個類,由同一個類的所有對象共同維護,為這些對象所共享。

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

注意,由于static不是函數類型中的一部分,所以在類定義之外定義靜態成員函數時不使用static,在類中定義的靜態成員函數是內聯的。

一般來說,通過成員名限定比使用對象名訪問靜態成員要好。因為靜態成員不是對象的成員。

靜態成員可以被繼承,這時,基類對象和派生類的對象共享該靜態成員,除此之外,在類等級中對靜態成員的其他特性(例如,靜態成員在派生類中的訪問權限,在派生類中重載成員函數等)的分析與一般成員類似。

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

類中的任何成員函數都可以訪問靜態成員,但靜態成員函數只能通過對象名(或指向對象的指針)訪問該對象的非靜態成員,因為靜態成員函數沒有this 指針。


虛函數必須是非靜態成員函數

構造函數不可以定義為static

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久亚洲成人| 日韩视频免费大全中文字幕| 国产精品欧美一区二区三区奶水| 国产字幕视频一区二区| 亚洲欧美一区二区三区久久| 亚洲人成艺术| 久久一二三四| 一区免费观看视频| 久久亚洲欧美| 欧美日本亚洲| 国内精品模特av私拍在线观看| 宅男噜噜噜66一区二区66| 亚洲国产日本| 欧美高清自拍一区| 日韩视频在线一区| 91久久在线视频| 欧美区高清在线| 99re6这里只有精品视频在线观看| 男人天堂欧美日韩| 蜜桃av综合| 亚洲免费av片| 在线亚洲一区观看| 国产精品久久久亚洲一区| 亚洲欧美日韩第一区| 亚洲一区二区三区777| 国产毛片精品国产一区二区三区| 久久精品国产77777蜜臀| 亚洲人成网站影音先锋播放| 在线亚洲成人| 国产一区二区三区免费不卡| 久久精品中文| 美日韩精品视频免费看| 亚洲精品国久久99热| 日韩系列在线| 国产欧美一区二区三区久久| 久久亚洲精品网站| 欧美成人一品| 亚洲欧美另类在线| 久久久www成人免费精品| 亚洲美女网站| 亚洲欧美日韩一区二区在线 | 嫩草影视亚洲| 欧美大片专区| 欧美一区亚洲一区| 狂野欧美一区| 性欧美激情精品| 欧美1区3d| 欧美中文字幕在线观看| 欧美成人dvd在线视频| 亚洲视频一区在线| 久久久久天天天天| 亚洲免费一区二区| 蜜臀99久久精品久久久久久软件| 99亚洲一区二区| 久久国产精品久久久久久久久久| 99国产精品国产精品毛片| 亚洲欧美在线免费| 亚洲天天影视| 免费人成网站在线观看欧美高清 | 亚洲欧美春色| 亚洲精品社区| 久久精品亚洲一区二区三区浴池| 中国亚洲黄色| 欧美成人一区在线| 久久亚洲春色中文字幕| 国产精品www网站| 欧美激情第4页| 国产综合av| 亚洲一区免费网站| 亚洲深夜福利在线| 欧美大成色www永久网站婷| 久久久久久久久久码影片| 欧美视频观看一区| 最新成人av网站| 亚洲国产欧美国产综合一区| 性色av香蕉一区二区| 亚洲午夜在线| 欧美日韩精品综合| 亚洲精品国产精品乱码不99按摩| 精品88久久久久88久久久| 亚洲一区二区在线| 国产精品99久久久久久白浆小说 | 亚洲激情专区| 久久免费偷拍视频| 老牛影视一区二区三区| 国产一区清纯| 亚洲中字在线| 欧美日韩中文字幕在线| 欧美黑人在线观看| 在线成人黄色| 久久精品道一区二区三区| 久久国产精品一区二区| 欧美亚州在线观看| 亚洲激情成人网| 一区二区不卡在线视频 午夜欧美不卡'| 久久精品视频免费观看| 久久久久久夜| 国产一区二区三区高清在线观看 | 欧美日本亚洲| 亚洲国产精品第一区二区| 亚洲第一黄网| 老妇喷水一区二区三区| 美女日韩在线中文字幕| 在线播放中文字幕一区| 久热精品在线视频| 亚洲国产精品精华液网站| 日韩午夜在线观看视频| 欧美日韩情趣电影| 亚洲午夜在线观看视频在线| 欧美亚洲午夜视频在线观看| 国产亚洲欧美日韩日本| 久久久久久久综合色一本| 欧美电影免费观看| 一区二区三区久久网| 国产精品入口尤物| 久久精品国产欧美激情| 亚洲国产电影| 午夜精品久久久久久久男人的天堂| 国产麻豆精品theporn| 久久婷婷亚洲| 99精品国产热久久91蜜凸| 欧美一二三区精品| 亚洲第一黄色| 国产精品久久久久7777婷婷| 久久精品免费播放| 亚洲精品永久免费| 欧美在线视频播放| 亚洲日本欧美日韩高观看| 国产精品红桃| 另类尿喷潮videofree| 在线中文字幕日韩| 六月丁香综合| 中日韩高清电影网| 激情文学综合丁香| 国产精品二区在线观看| 久久久水蜜桃| 亚洲欧美精品伊人久久| 亚洲国产成人av| 久久精品色图| 亚洲一区二区免费看| 在线观看国产日韩| 国产精品免费小视频| 欧美成人精品激情在线观看| 亚洲欧美日韩精品在线| 亚洲国产影院| 久久综合激情| 午夜精品亚洲一区二区三区嫩草| 亚洲国产精品激情在线观看| 国产精品系列在线播放| 欧美日本一区二区视频在线观看| 久久精品日韩欧美| 亚洲欧美激情四射在线日 | 久久久久久香蕉网| 亚洲免费视频在线观看| 亚洲肉体裸体xxxx137| 欧美成人午夜影院| 国产欧美日韩一区二区三区在线| 欧美成人日韩| 久久gogo国模啪啪人体图| 亚洲私人影院| 日韩一级二级三级| 亚洲国产91色在线| 欧美激情亚洲视频| 毛片av中文字幕一区二区| 翔田千里一区二区| 亚洲午夜黄色| 亚洲图色在线| 亚洲色图在线视频| 夜夜爽av福利精品导航| 亚洲欧洲日本mm| 亚洲国产精品第一区二区三区| 悠悠资源网亚洲青| 一色屋精品亚洲香蕉网站| 国产亚洲午夜| 国内精品久久久| 韩日视频一区| 亚洲第一成人在线| 亚洲欧洲日韩在线| 亚洲日本久久| 一区二区三区久久网| 在线视频欧美日韩| 亚洲天堂av高清| 亚洲欧美视频一区二区三区| 午夜久久影院| 久久国产成人| 老司机亚洲精品| 欧美激情视频一区二区三区不卡| 亚洲二区在线视频| 亚洲精品一区二区三区四区高清| 亚洲美女91| 亚洲午夜电影| 久久国产主播| 久久久亚洲综合| 欧美黑人多人双交| 欧美日韩国产色视频| 国产精品毛片高清在线完整版| 国产精品自拍在线| 原创国产精品91| 99国产精品久久久久久久| 亚洲综合欧美日韩|