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

posts - 297,  comments - 15,  trackbacks - 0

C++static有兩種用法:面向過程程序設(shè)計中的static和面向?qū)ο蟪绦蛟O(shè)計中的static。前者應(yīng)用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用。

一、面向過程設(shè)計中的static

1、靜態(tài)全局變量

在全局變量前,加上關(guān)鍵字static,該變量就被定義成為一個靜態(tài)全局變量。我們先舉一個靜態(tài)全局變量的例子,如下:

//Example 1

#include <iostream.h>

void fn();

static int n; //定義靜態(tài)全局變量

void main()

{

    n = 20;

    cout<< n <<endl;

    fn();

}

 

void fn()

{

    n++;

    cout<< n <<endl;

}

靜態(tài)全局變量有以下特點:

·       該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存;

·       未經(jīng)初始化的靜態(tài)全局變量會被程序自動初始化為0(自動變量的值是隨機的,除非它被顯式初始化);

·       靜態(tài)全局變量在聲明它的整個文件都是可見的,而在文件之外是不可見的; 

靜態(tài)變量都在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,包括后面將要提到的靜態(tài)局部變量。對于一個完整的程序,在內(nèi)存中的分布情況如下圖:

代碼區(qū)

全局?jǐn)?shù)據(jù)區(qū)

堆區(qū)

棧區(qū)

一般程序的由new產(chǎn)生的動態(tài)數(shù)據(jù)存放在堆區(qū),函數(shù)內(nèi)部的自動變量存放在棧區(qū)。自動變量一般會隨著函數(shù)的退出而釋放空間,靜態(tài)數(shù)據(jù)(即使是函數(shù)內(nèi)部的靜態(tài)局部變量)也存放在全局?jǐn)?shù)據(jù)區(qū)。全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù)并不會因為函數(shù)的退出而釋放空間。細心的讀者可能會發(fā)現(xiàn),Example 1中的代碼中將

static int n; //定義靜態(tài)全局變量

改為

int n; //定義全局變量

程序照樣正常運行。

的確,定義全局變量就可以實現(xiàn)變量在文件中的共享,但定義靜態(tài)全局變量還有以下好處:

·       靜態(tài)全局變量不能被其它文件所用;

·       其它文件中可以定義相同名字的變量,不會發(fā)生沖突;

您可以將上述示例代碼改為如下:

//Example 2

//File1

#include <iostream.h>

void fn();

static int n; //定義靜態(tài)全局變量

void main()

{

    n=20;

    cout<<n<<endl;

    fn();

}

 

//File2

#include <iostream.h>

extern int n;

void fn()

{

    n++;

    cout<<n<<endl;

}

編譯并運行Example 2,您就會發(fā)現(xiàn)上述代碼可以分別通過編譯,但運行時出現(xiàn)錯誤。 試著將

static int n; //定義靜態(tài)全局變量

改為

int n; //定義全局變量

再次編譯運行程序,細心體會全局變量和靜態(tài)全局變量的區(qū)別(驗證共享和保護關(guān)系)

 

2、靜態(tài)局部變量

在局部變量前,加上關(guān)鍵字static,該變量就被定義成為一個靜態(tài)局部變量。

我們先舉一個靜態(tài)局部變量的例子,如下:

//Example 3

#include <iostream.h>

void fn();

void main()

{

    fn();

    fn();

    fn();

}

 

void fn()

{

    static n=10;

    cout<<n<<endl;

    n++;

}

通常,在函數(shù)體內(nèi)定義了一個變量,每當(dāng)程序運行到該語句時都會給該局部變量分配棧內(nèi)存。但隨著程序退出函數(shù)體,系統(tǒng)就會收回棧內(nèi)存,局部變量也相應(yīng)失效。

但有時候我們需要在兩次調(diào)用之間對變量的值進行保存。通常的想法是定義一個全局變量來實現(xiàn)。但這樣一來,變量已經(jīng)不再屬于函數(shù)本身了,不再僅受函數(shù)的控制,給程序的維護帶來不便。

靜態(tài)局部變量正好可以解決這個問題。靜態(tài)局部變量保存在全局?jǐn)?shù)據(jù)區(qū),而不是保存在棧中,每次的值保持到下一次調(diào)用,直到下次賦新值。

靜態(tài)局部變量有以下特點:

·       該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存;

·       靜態(tài)局部變量在程序執(zhí)行到該對象的聲明處時被首次初始化,即以后的函數(shù)調(diào)用不再進行初始化;

·       靜態(tài)局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0

·       它始終駐留在全局?jǐn)?shù)據(jù)區(qū),直到程序運行結(jié)束。但其作用域為局部作用域,當(dāng)定義它的函數(shù)或語句塊結(jié)束時,其作用域隨之結(jié)束

 

3、靜態(tài)函數(shù)

在函數(shù)的返回類型前加上static關(guān)鍵字,函數(shù)即被定義為靜態(tài)函數(shù)。靜態(tài)函數(shù)與普通函數(shù)不同,它只能在聲明它的文件當(dāng)中可見,不能被其它文件使用。

靜態(tài)函數(shù)的例子:

//Example 4

#include <iostream.h>

static void fn();//聲明靜態(tài)函數(shù)

void main()

{

    fn();

}

 

void fn()//定義靜態(tài)函數(shù)

{

    int n=10;

    cout<<n<<endl;

}

定義靜態(tài)函數(shù)的好處:

·       靜態(tài)函數(shù)不能被其它文件所用;

·       其它文件中可以定義相同名字的函數(shù),不會發(fā)生沖突

 

二、面向?qū)ο蟮?span lang="EN-US">static關(guān)鍵字(類中的static關(guān)鍵字)

1、靜態(tài)數(shù)據(jù)成員

在類內(nèi)數(shù)據(jù)成員的聲明前加上關(guān)鍵字static,該數(shù)據(jù)成員就是類內(nèi)的靜態(tài)數(shù)據(jù)成員。先舉一個靜態(tài)數(shù)據(jù)成員的例子。

//Example 5

#include <iostream.h>

class Myclass

{

public:

    Myclass(int a,int b,int c);

    void GetSum();

private:

    int a,b,c;

    static int Sum;//聲明靜態(tài)數(shù)據(jù)成員

};

//以下部分不能出現(xiàn)在頭文件中

int Myclass::Sum = 0;//定義并初始化靜態(tài)數(shù)據(jù)成員

 

Myclass::Myclass(int a,int b,int c)

{

    this->a=a;

    this->b=b;

    this->c=c;

    Sum+=a+b+c;

}

 

void Myclass::GetSum()

{

    cout<<"Sum="<<Sum<<endl;

}

 

void main()

{

    Myclass M(1,2,3);

    M.GetSum();     //Sum = 6

    Myclass N(4,5,6);

    N.GetSum();     //Sum = 21

    M.GetSum();     //Sum = 21

}

可以看出,靜態(tài)數(shù)據(jù)成員有以下特點:

·       對于非靜態(tài)數(shù)據(jù)成員,每個類對象都有自己的拷貝。而靜態(tài)數(shù)據(jù)成員被當(dāng)作是類的成員。無論這個類的對象被定義了多少個,靜態(tài)數(shù)據(jù)成員在程序中也只有一份拷貝,由該類型的所有對象共享訪問。也就是說,靜態(tài)數(shù)據(jù)成員是該類的所有對象所共有的。對該類的多個對象來說,靜態(tài)數(shù)據(jù)成員只分配一次內(nèi)存,供所有對象共用。所以,靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣的,它的值可以更新

·       靜態(tài)數(shù)據(jù)成員存儲在全局?jǐn)?shù)據(jù)區(qū)。靜態(tài)數(shù)據(jù)成員定義時要分配空間,所以不能在類聲明中定義。在Example 5中,語句int Myclass::Sum=0;是定義靜態(tài)數(shù)據(jù)成員;

·       靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員一樣遵從public,protected,private訪問規(guī)則;

·       因為靜態(tài)數(shù)據(jù)成員在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,屬于本類的所有對象共享,所以,它不屬于特定的類對象,在沒有產(chǎn)生類對象時其作用域就可見,即在沒有產(chǎn)生類的實例時,我們就可以操作它

·       靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式為:<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>

·       類的靜態(tài)數(shù)據(jù)成員有兩種訪問形式:<類對象名>.<靜態(tài)數(shù)據(jù)成員名> 或<類類型名>::<靜態(tài)數(shù)據(jù)成員名>如果靜態(tài)數(shù)據(jù)成員的訪問權(quán)限允許的話(即public的成員),可在程序中,按上述格式來引用靜態(tài)數(shù)據(jù)成員;

·       靜 態(tài)數(shù)據(jù)成員主要用在各個對象都有相同的某項屬性的時候。比如對于一個存款類,每個實例的利息都是相同的。所以,應(yīng)該把利息設(shè)為存款類的靜態(tài)數(shù)據(jù)成員。這有 兩個好處,第一,不管定義多少個存款類對象,利息數(shù)據(jù)成員都共享分配在全局?jǐn)?shù)據(jù)區(qū)的內(nèi)存,所以節(jié)省存儲空間。第二,一旦利息需要改變時,只要改變一次,則 所有存款類對象的利息全改變過來了;

·       同全局變量相比,使用靜態(tài)數(shù)據(jù)成員有兩個優(yōu)勢:

1.   靜態(tài)數(shù)據(jù)成員沒有進入程序的全局名字空間,因此不存在與程序中其它全局名字沖突的可能性;

2.   可以實現(xiàn)信息隱藏。靜態(tài)數(shù)據(jù)成員可以是private成員,而全局變量不能

 

2、靜態(tài)成員函數(shù)

與靜態(tài)數(shù)據(jù)成員一樣,我們也可以創(chuàng)建一個靜態(tài)成員函數(shù),它為類的全部服務(wù)而不是為某一個類的具體對象服務(wù)。靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,都是類的內(nèi)部實現(xiàn),屬于類定義的一部分。普通的成員函數(shù)一般都隱含了一個this指針,this指針指向類的對象本身,因為普通成員函數(shù)總是具體的屬于某個類的具體對象的。通常情況下,this是缺省的。如函數(shù)fn()實際上是this->fn()。但是與普通函數(shù)相比,靜態(tài)成員函數(shù)由于不是與任何的對象相聯(lián)系,因此它不具有this指針。從這個意義上講,它無法訪問屬于類對象的非靜態(tài)數(shù)據(jù)成員,也無法訪問非靜態(tài)成員函數(shù),它只能調(diào)用其余的靜態(tài)成員函數(shù)。 下面舉個靜態(tài)成員函數(shù)的例子。

//Example 6

#include <iostream.h>

class Myclass

{

public:

    Myclass(int a,int b,int c);

    static void GetSum();//聲明靜態(tài)成員函數(shù)

private:

    int a,b,c;

    static int Sum;//聲明靜態(tài)數(shù)據(jù)成員

};

 

//以下必須在實現(xiàn)文件中

int Myclass::Sum=0;//定義并初始化靜態(tài)數(shù)據(jù)成員

 

Myclass::Myclass(int a,int b,int c)

{

    this->a=a;

    this->b=b;

    this->c=c;

    Sum+=a+b+c; //非靜態(tài)成員函數(shù)可以訪問靜態(tài)數(shù)據(jù)成員

}

 

void Myclass::GetSum() //靜態(tài)成員函數(shù)的實現(xiàn)

{

//  cout<<a<<endl; //錯誤代碼,a是非靜態(tài)數(shù)據(jù)成員

    cout<<"Sum="<<Sum<<endl;

}

 

void main()

{

    Myclass M(1,2,3);

    M.GetSum();

    Myclass N(4,5,6);

    N.GetSum();

    Myclass::GetSum();

}

關(guān)于靜態(tài)成員函數(shù),可以總結(jié)為以下幾點:

·       出現(xiàn)在類體外的函數(shù)定義不能指定關(guān)鍵字static

·       靜態(tài)成員之間可以相互訪問,包括靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員和訪問靜態(tài)成員函數(shù);

·       非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員;

·       靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)數(shù)據(jù)成員;

·       由于沒有this指針的額外開銷,因此靜態(tài)成員函數(shù)與類的全局函數(shù)相比速度上會有少許的增長;

·       調(diào)用靜態(tài)成員函數(shù),可以用成員訪問操作符(.)(->)為一個類的對象或指向類對象的指針調(diào)用靜態(tài)成員函數(shù),也可以直接使用如下格式:<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)調(diào)用類的靜態(tài)成員函數(shù)。

 

另:VC6VC7.1static支持的差異

class CStaic

{

public:

    CStatic()

    {

    }

 

    ~CStatic()

    {

    }

 

private:

    static const int DefaultBufferSize = 1024;

};

 

上面的寫法在VC++ .net 7.1能夠編譯通過,但是在VC6上不支持,會出現(xiàn)編譯錯誤。

需要改成下面的寫法。

class CStaic

{

public:

    CStatic()

    {

    }

 

    ~CStatic()

    {

    }

 

private:

    static const int DefaultBufferSize;

};

 

const int CStaic::DefaultBufferSize = 1024;
posted on 2008-07-19 00:56 chatler 閱讀(281) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩视频精品在线| 亚洲欧洲精品一区二区三区 | 亚洲国产精品www| 久久这里有精品视频| 久久久综合网站| 在线观看日韩专区| 亚洲高清视频在线| 亚洲三级免费电影| 亚洲人成欧美中文字幕| 国产日韩精品在线观看| 欧美精品久久久久a| 国语精品一区| 久久久久九九九| 亚洲影视综合| 欧美日韩一区二区三区高清| 亚洲国产精品悠悠久久琪琪| 久久蜜桃精品| 欧美一区二区观看视频| 国产欧美一区二区三区国产幕精品| 正在播放欧美一区| 久久免费视频这里只有精品| 新67194成人永久网站| 国产一区91| 久久久久久久久久久久久女国产乱| 亚洲午夜日本在线观看| 欧美午夜一区二区三区免费大片 | 国产精品国产馆在线真实露脸| 亚洲黄色尤物视频| 免费在线观看一区二区| 美女91精品| 欧美日韩一区二区三区在线看 | 久久这里有精品视频| 伊人久久综合97精品| 免费h精品视频在线播放| 免费成人激情视频| 一卡二卡3卡四卡高清精品视频| 亚洲理论在线观看| 国产精品呻吟| 免费欧美在线视频| 欧美久久久久久久| 国产精品亚洲欧美| 亚洲精品一区二区三区99| 亚洲精品欧洲精品| 国产欧美日本一区二区三区| 久久视频在线看| 久久综合给合久久狠狠色| 日韩午夜av电影| 午夜天堂精品久久久久| 亚洲国产精品t66y| 亚洲日本电影在线| 国产精品老牛| 亚洲一区二区三区精品在线| 欧美一区二区高清| 亚洲高清视频一区| 亚洲欧美成人一区二区在线电影| 一区二区三区中文在线观看| 亚洲精品日韩激情在线电影| 国产欧美精品一区| 亚洲黄色性网站| 国产女人水真多18毛片18精品视频| 欧美一区二区精品在线| 午夜国产欧美理论在线播放 | 欧美日韩在线精品| 久久精品国亚洲| 一区二区三区欧美在线| 欧美成人免费网站| 久久久久久精| 国产精品二区在线观看| 欧美国产视频在线| 国产精品羞羞答答xxdd| 亚洲黄色在线| 在线不卡欧美| 欧美xxx在线观看| 欧美另类69精品久久久久9999| 久久久久久久综合狠狠综合| 欧美色视频在线| 欧美国产综合| 狠狠色狠狠色综合日日tαg| 一区二区三欧美| 一区二区日韩欧美| 美女主播精品视频一二三四| 久久一二三四| 激情小说亚洲一区| 亚洲综合精品四区| 亚洲摸下面视频| 欧美日韩午夜精品| 亚洲激情国产| 在线看成人片| 久久精品国产视频| av不卡免费看| 欧美久色视频| 亚洲精品久久7777| 日韩一级在线| 久久精品国产久精国产一老狼| 欧美一区二区精品| 国产精品五月天| 亚洲一区二区三区免费视频 | 久久久精品日韩| 国产丝袜美腿一区二区三区| 亚洲在线视频一区| 欧美一区=区| 国产乱肥老妇国产一区二| 亚洲免费一区二区| 久久激情中文| 黄色在线一区| 美女脱光内衣内裤视频久久影院| 麻豆精品传媒视频| 欧美日韩久久久久久| 中文成人激情娱乐网| 亚洲一区美女视频在线观看免费| 欧美另类69精品久久久久9999| 99国产精品国产精品久久| 亚洲在线不卡| 国产欧美一区视频| 欧美高清视频免费观看| 欧美激情亚洲激情| 亚洲永久在线| 国产一区在线视频| 欧美va亚洲va香蕉在线| 久久精品主播| 亚洲欧洲精品一区| 国产精品护士白丝一区av| 欧美一乱一性一交一视频| 美玉足脚交一区二区三区图片| 亚洲欧洲综合| 亚洲校园激情| 亚洲经典在线看| 欧美精品在欧美一区二区少妇| 9l国产精品久久久久麻豆| 亚洲精品久久久久久下一站| 欧美日韩国产综合视频在线观看中文| 一区二区三区四区五区视频| 久久精品官网| 一区二区三区四区精品| 黄色亚洲免费| 欧美亚一区二区| 午夜精品免费视频| 亚洲日韩视频| 国产亚洲人成网站在线观看| 欧美精品aa| 久久精品欧美日韩精品| 99国产精品一区| 久热这里只精品99re8久| 亚洲一区二区三区久久| 欧美日韩视频专区在线播放 | 欧美日韩色婷婷| 亚洲尤物在线| 日韩午夜激情av| 亚洲精品一区二区三区樱花| 亚洲丰满在线| 亚洲国产精品ⅴa在线观看| 亚洲国产成人tv| 9国产精品视频| 一本大道久久a久久精二百| 这里只有精品丝袜| 亚洲欧美日韩视频二区| 欧美一区二区大片| 久久久另类综合| 看片网站欧美日韩| 亚洲大胆女人| 欧美韩日精品| 亚洲美女性视频| 亚洲一区二区影院| 欧美一区2区三区4区公司二百| 久久成人免费电影| 欧美成人午夜激情视频| 欧美日韩一区二| 国产欧美日韩视频| 亚洲国产视频直播| 宅男噜噜噜66一区二区| 久久精品99久久香蕉国产色戒 | 99精品国产一区二区青青牛奶| 99国产精品久久| 亚洲欧美中文日韩v在线观看| 久久久久久亚洲精品不卡4k岛国| 欧美福利在线| 亚洲视频在线播放| 久久精品久久99精品久久| 欧美成人dvd在线视频| 国产精品实拍| 亚洲精品国久久99热| 午夜精品国产更新| 欧美99在线视频观看| 亚洲一区二区成人在线观看| 免费观看国产成人| 国产精品美女久久久久久2018 | 国产精品国内视频| 亚洲激情电影中文字幕| 午夜影视日本亚洲欧洲精品| 欧美不卡视频| 性欧美大战久久久久久久久| 欧美国产在线电影| 伊人男人综合视频网| 亚洲欧美日韩国产成人精品影院| 蜜桃av一区| 欧美激情1区2区3区| 午夜伦理片一区| 欧美午夜精品久久久久久浪潮| 在线观看精品视频| 久久久国产一区二区三区|