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

posts - 297,  comments - 15,  trackbacks - 0

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

一、面向過(guò)程設(shè)計(jì)中的static

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

在全局變量前,加上關(guān)鍵字static,該變量就被定義成為一個(gè)靜態(tài)全局變量。我們先舉一個(gè)靜態(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)全局變量有以下特點(diǎn):

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

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

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

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

代碼區(qū)

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

堆區(qū)

棧區(qū)

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

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

改為

int n; //定義全局變量

程序照樣正常運(yùn)行。

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

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

·       其它文件中可以定義相同名字的變量,不會(huì)發(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;

}

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

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

改為

int n; //定義全局變量

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

 

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

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

我們先舉一個(gè)靜態(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)定義了一個(gè)變量,每當(dāng)程序運(yùn)行到該語(yǔ)句時(shí)都會(huì)給該局部變量分配棧內(nèi)存。但隨著程序退出函數(shù)體,系統(tǒng)就會(huì)收回棧內(nèi)存,局部變量也相應(yīng)失效。

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

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

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

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

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

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

·       它始終駐留在全局?jǐn)?shù)據(jù)區(qū),直到程序運(yùn)行結(jié)束。但其作用域?yàn)榫植孔饔糜?/strong>,當(dāng)定義它的函數(shù)或語(yǔ)句塊結(jié)束時(shí),其作用域隨之結(jié)束

 

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

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

靜態(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ù),不會(huì)發(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ù)成員。先舉一個(gè)靜態(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ù)成員有以下特點(diǎn):

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

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

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

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

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

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

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

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

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

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

 

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

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

};

 

//以下必須在實(shí)現(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ù)可以訪問(wèn)靜態(tài)數(shù)據(jù)成員

}

 

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

{

//  cout<<a<<endl; //錯(cuò)誤代碼,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é)為以下幾點(diǎn):

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

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

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

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

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

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

 

另:VC6VC7.1對(duì)static支持的差異

class CStaic

{

public:

    CStatic()

    {

    }

 

    ~CStatic()

    {

    }

 

private:

    static const int DefaultBufferSize = 1024;

};

 

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

需要改成下面的寫法。

class CStaic

{

public:

    CStatic()

    {

    }

 

    ~CStatic()

    {

    }

 

private:

    static const int DefaultBufferSize;

};

 

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

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              99日韩精品| 国产香蕉久久精品综合网| 伊人久久大香线蕉综合热线 | 欧美日韩国产综合新一区| 国产一区二区三区在线免费观看| 一区二区三区四区五区在线| 欧美黄免费看| 久久久久欧美精品| 国产精品网红福利| 亚洲一区二区三区在线看 | 国产精品在线看| 在线亚洲精品| 亚洲日本成人女熟在线观看| 久热国产精品| 伊人久久噜噜噜躁狠狠躁| 久久精品国产精品亚洲综合 | 欧美精品一区二区高清在线观看| 在线观看日韩专区| 久久影视三级福利片| 香蕉成人伊视频在线观看 | 欧美日韩高清区| 亚洲区一区二| 亚洲国产精品成人va在线观看| 久久理论片午夜琪琪电影网| 国产一区亚洲一区| 久久精品亚洲国产奇米99| 亚洲欧美日韩天堂| 国产精品专区h在线观看| 亚洲欧美日韩在线综合| 一区二区三区视频在线看| 欧美日韩精品久久久| 一区二区三区欧美日韩| 亚洲美女尤物影院| 欧美日韩中文在线| 亚洲欧美日韩区| 亚洲欧美日韩区| 国产精品羞羞答答| 久久精品30| 久久精品国产亚洲aⅴ| 激情懂色av一区av二区av| 免费不卡视频| 欧美成人免费一级人片100| 亚洲国产专区校园欧美| 亚洲欧洲日韩在线| 欧美日韩另类丝袜其他| 亚洲在线观看视频网站| 亚洲男人第一网站| 国产一区二区三区四区在线观看| 久久久久亚洲综合| 免费成人黄色av| 99在线精品视频在线观看| 亚洲精品偷拍| 国产精品男gay被猛男狂揉视频| 性色av一区二区三区红粉影视| 午夜在线a亚洲v天堂网2018| 激情小说另类小说亚洲欧美| 韩国精品主播一区二区在线观看| 亚洲自拍电影| 欧美性猛交xxxx乱大交蜜桃| 久久久久久久精| 欧美日韩国产综合视频在线观看中文 | 激情成人综合网| 99精品国产高清一区二区| 国产综合网站| 99国产精品久久久久老师| 一区在线观看视频| 中文成人激情娱乐网| 亚洲国产另类精品专区 | 久久综合九色99| 欧美视频观看一区| 嫩草影视亚洲| 国产精品伊人日日| 最新高清无码专区| 一区二区亚洲精品| 亚洲午夜女主播在线直播| 亚洲人成亚洲人成在线观看| 亚洲欧美一区二区三区久久| 夜久久久久久| 美女主播一区| 久久精品国产成人| 欧美视频三区在线播放| 欧美黄色影院| 韩国三级在线一区| 亚洲一区二区在线看| 99精品热视频只有精品10| 久久先锋影音av| 欧美中文在线观看国产| 欧美午夜精品理论片a级按摩 | 黄色成人小视频| 亚洲永久精品大片| 亚洲午夜激情免费视频| 欧美成年人视频网站欧美| 可以免费看不卡的av网站| 国产精品私人影院| 一区二区三区四区国产| 日韩亚洲国产精品| 老司机免费视频一区二区三区| 久久精品视频导航| 国产精品自拍小视频| 国产精品99久久久久久久vr| 一本久久青青| 欧美电影资源| 欧美激情在线| 亚洲国产精品久久久久秋霞蜜臀| 欧美在线播放| 久久精品国产第一区二区三区最新章节 | 亚洲三级影片| 免费一级欧美片在线播放| 美女黄毛**国产精品啪啪| 国产在线精品一区二区中文| 亚洲欧美欧美一区二区三区| 午夜欧美精品| 国产精品美女久久久久aⅴ国产馆| 99re成人精品视频| 中日韩在线视频| 欧美日韩一区二区三区视频 | 欧美午夜大胆人体| 夜夜爽夜夜爽精品视频| 中文欧美日韩| 欧美日韩一区国产| 一本色道久久综合亚洲二区三区 | 欧美电影免费观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲高清精品中出| 免费一区视频| 亚洲国产精品第一区二区三区| 亚洲精品极品| 欧美日韩精品欧美日韩精品| 99在线精品观看| 亚洲欧美变态国产另类| 国产精品免费电影| 午夜精品美女自拍福到在线 | 久久久亚洲国产天美传媒修理工| 久久这里只有| 亚洲国产另类精品专区| 欧美高清你懂得| 亚洲精选91| 亚洲免费小视频| 国产日韩欧美二区| 久久久999精品| 亚洲国产高清aⅴ视频| aa日韩免费精品视频一| 欧美色欧美亚洲另类七区| 亚洲综合激情| 久久免费少妇高潮久久精品99| 狠狠色丁香久久婷婷综合丁香| 久久一综合视频| 亚洲精品国产拍免费91在线| 亚洲一级特黄| 国产色产综合色产在线视频| 久久嫩草精品久久久久| 最新国产成人在线观看| 亚洲男人天堂2024| 国产有码一区二区| 免费日韩成人| 亚洲视频一区二区在线观看| 久久精品中文字幕免费mv| 亚洲观看高清完整版在线观看| 欧美久久久久久久久久| 亚洲自拍偷拍网址| 免费日韩av| 在线视频精品| 国产三级精品三级| 欧美α欧美αv大片| 中文精品视频一区二区在线观看| 久久精品国产亚洲aⅴ| 亚洲人成在线观看一区二区| 欧美无砖砖区免费| 久久精品日韩欧美| 亚洲美女视频在线观看| 久久精品国产免费| 亚洲精品少妇网址| 国产欧美日韩精品专区| 免费国产一区二区| 中文在线资源观看视频网站免费不卡| 久久久久久一区| 夜色激情一区二区| 韩国精品在线观看| 欧美日韩国产专区| 久久久91精品国产一区二区三区| 亚洲人久久久| 久久久噜噜噜久久人人看| 日韩视频永久免费| 国产一本一道久久香蕉| 欧美激情第一页xxx| 欧美一级日韩一级| 亚洲伦理在线免费看| 久久亚洲高清| 亚洲欧美精品suv| 亚洲激情女人| 国产日韩欧美精品| 欧美日韩激情小视频| 久久精品在线| 亚洲视频在线二区| 亚洲国产精品第一区二区| 久久精品亚洲一区二区三区浴池| 一本色道88久久加勒比精品| 精品999网站| 国产精品人人做人人爽| 欧美激情一区二区三级高清视频 |