最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )

 更新時(shí)間:2017年06月16日 08:51:55   投稿:lqh  
這篇文章主要介紹了C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )的相關(guān)資料,需要的朋友可以參考下

C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )

這篇介紹了靜態(tài)成員函數(shù)與靜態(tài)成員變量,是我的讀書筆記,我希望它夠簡(jiǎn)短但又比較全面,起到復(fù)習(xí)的作用。如果有一些C++知識(shí)記不清楚了,它可以幫你很快回憶起來。

復(fù)習(xí)C語言的static關(guān)鍵字

(1)加在局部變量的前面使之成為靜態(tài)局部變量,作用域還是在函數(shù)內(nèi)部,可是生存周期延長(zhǎng)了。

(2)加在全局變量的前面限定該變量作用域?yàn)槲募饔糜颍褪钦f即使其他文件使用了extern擴(kuò)展作用域也不行。這在C語言的多人項(xiàng)目中非常有用,避免了變量的重名。然而在C++中這一功能已經(jīng)被命名空間取代,但是為了保持和C語言的兼容,static還是有這樣的功能。

(3)加在函數(shù)定義或聲明的前面,限定函數(shù)作用域到文件作用域,也是為了避免多個(gè)文件中有重名函數(shù)。

當(dāng)static關(guān)鍵字出現(xiàn)在類中

當(dāng)static出現(xiàn)在類的定義中便出現(xiàn)了靜態(tài)成員變量和靜態(tài)成員函數(shù)。靜態(tài)成員是屬于類的,而不是屬于某個(gè)對(duì)象的。即便沒有任何一個(gè)實(shí)例,類的靜態(tài)成員變量也已經(jīng)存在了,而且還可能通過“類名::成員名”進(jìn)行訪問。類的靜態(tài)成員函數(shù)也可以用相同的方式調(diào)用,在類產(chǎn)生實(shí)例之前就調(diào)用成員方法,典型應(yīng)用是實(shí)現(xiàn)單例模式。

(1)靜態(tài)成員變量

靜態(tài)成員變量本質(zhì)上是全局變量,但是將和某些類關(guān)系緊密的全局變量寫到類里面,形式上成為一個(gè)整體,更容易理解和維護(hù)。所以盡量使用靜態(tài)成員變量吧,減少全局變量的使用。普通成員變量每個(gè)對(duì)象都有各自的一份,但是靜態(tài)成員變量一共只有一份,被所有的本類對(duì)象共享。如果使用sizeof運(yùn)算符計(jì)算對(duì)象的大小,得到的結(jié)果是不包含靜態(tài)成員變量在內(nèi)的。

靜態(tài)成員同樣受到private,public等的限制。

靜態(tài)成員變量的一個(gè)典型應(yīng)用就是用來計(jì)數(shù)生成的實(shí)例的個(gè)數(shù)。大體思路是設(shè)置一個(gè)名為num的靜態(tài)成員變量并初始化為0,在構(gòu)造函數(shù)中++num,析構(gòu)函數(shù)中--num。這樣num的值就是當(dāng)前實(shí)例的個(gè)數(shù)。實(shí)際上這也帶來了一個(gè)隱蔽的bug。看下面的代碼:

class CNum {
   public:
       static int num;
       ~CNum() { --num; }
       CNum() { ++num; }
};

int CNum::num = 0;
void fun(CNum n){ }

 int main() {
   CNum n;
   fun(n);
   fun(n);
   cout << CNum::num << endl;
  return 0;
}

結(jié)果:-1

num盡然成了一個(gè)負(fù)數(shù),難道析構(gòu)函數(shù)比構(gòu)造函數(shù)多調(diào)用了一次?實(shí)際上不是的。當(dāng)執(zhí)行 fun(n); 語句時(shí)調(diào)用了復(fù)制構(gòu)造函數(shù),這個(gè)函數(shù)因?yàn)槲覀儧]有給出實(shí)現(xiàn),所以是用的編譯器默認(rèn)提供的版本,在這個(gè)構(gòu)造函數(shù)中并沒有++num這條語句,因此少計(jì)數(shù)了兩次(兩次調(diào)用fun(n))。

解決的方法就是一定要提供自己寫的復(fù)制構(gòu)造函數(shù)并在函數(shù)體中加入 ++num;

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

靜態(tài)成員函數(shù)內(nèi)部不能調(diào)用非靜態(tài)成員函數(shù),原因是,非靜態(tài)成員函數(shù)需要傳入一個(gè)this指針,這讓靜態(tài)成員函數(shù)很為難,它并不知道與之相關(guān)的信息,也就無法提供this指針。

靜態(tài)成員變量的初始化

上面代碼中的第8行  int CNum::num = 0; 是靜態(tài)成員變量的初始化。這可以視為是靜態(tài)變量的定義(定義的同時(shí)初始化,即便不初始化也需要這個(gè)定義),而把類內(nèi)的 static int num; 視為一個(gè)聲明,這樣的理解可以突出這樣一個(gè)事實(shí):靜態(tài)成員變量本質(zhì)上是全局變量。注意在類外定義時(shí)加上“類名::”。

對(duì)于常量成員變量,我們知道初始化時(shí)一定要使用初始化列表,那么當(dāng)一個(gè)變量既是常量又是靜態(tài)成員時(shí)(同時(shí)被const和static修飾)要怎么樣初始化呢?是像一般的靜態(tài)成員變量一樣在類外定義并初始化,還是像一般的常量成員變量一樣使用初始化列表呢?答案時(shí)前者,即在類外定義并初始化,在類內(nèi)聲明,就像下面那樣:

class CNum {
   public:
      const static int num;
};

const int CNum::num = 0;

 int main() {
   CNum n;
  return 0;
}

實(shí)際上,完全可以把const int 視為一種數(shù)據(jù)類型,它的地位和int一樣。這樣理解是有好處的,比如從const int到int需要強(qiáng)制類型轉(zhuǎn)換,把他們看成兩種類型,這就自然而然。相應(yīng)的const char 和char 也應(yīng)該看成兩種類型,就好像它們完全沒有什么特殊的關(guān)系一樣。

另外static const int類型和static const char 類型可以在類內(nèi)直接初始化,就是說都不需要在類外再次定義,像下面這樣:

class CNum {
   public:
     const static int a = 19;
};


 int main() { 8   cout << CNum::a << endl;    //輸出19
  return 0;
}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++編寫實(shí)現(xiàn)圖書管理系統(tǒng)

    C++編寫實(shí)現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++編寫實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C/C++字節(jié)序的深入理解

    C/C++字節(jié)序的深入理解

    本文主要介紹了C/C++字節(jié)序的深入理解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++ map用法總結(jié)(整理)

    C++ map用法總結(jié)(整理)

    這篇文章主要介紹了C++ map用法總結(jié)(整理),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Microsoft?Visual?C++進(jìn)行調(diào)試的方法實(shí)現(xiàn)

    Microsoft?Visual?C++進(jìn)行調(diào)試的方法實(shí)現(xiàn)

    VS功能極其強(qiáng)大,使用極其便利,本文主要介紹了Microsoft?Visual?C++進(jìn)行調(diào)試的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • C++內(nèi)存泄漏檢測(cè)和解決方法小結(jié)

    C++內(nèi)存泄漏檢測(cè)和解決方法小結(jié)

    內(nèi)存泄露在編程中是常見的一種問題,一但程序發(fā)生內(nèi)存泄露問題,將導(dǎo)致程序崩潰無法運(yùn)行,內(nèi)存泄漏是指程序在運(yùn)行過程中,由于疏忽或錯(cuò)誤導(dǎo)致已分配的內(nèi)存空間無法被正確釋放,本文給大家就介紹了C++中內(nèi)存泄漏如何檢測(cè)和解決,需要的朋友可以參考下
    2025-01-01
  • 詳解C語言fscanf函數(shù)讀取文件教程及源碼

    詳解C語言fscanf函數(shù)讀取文件教程及源碼

    這篇文章主要為大家介紹了詳解C語言算法fscanf讀取文件示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 詳解C語言中的memset()函數(shù)

    詳解C語言中的memset()函數(shù)

    這篇文章主要介紹了C語言中的memset()函數(shù),包括其與memcpy()函數(shù)的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • vc提示unexpected end of file found的原因分析

    vc提示unexpected end of file found的原因分析

    這篇文章主要介紹了vc提示unexpected end of file found的原因分析,給出了幾點(diǎn)常見錯(cuò)誤原因的分析,需要的朋友可以參考下
    2015-05-05
  • C語言拓展實(shí)現(xiàn)Lua sleep函數(shù)

    C語言拓展實(shí)現(xiàn)Lua sleep函數(shù)

    這篇文章主要介紹了C語言拓展實(shí)現(xiàn)Lua sleep函數(shù),本文使用C語言寫出sleep函數(shù),編譯后在Lua中調(diào)用,需要的朋友可以參考下
    2015-04-04
  • C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息

    C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息

    這篇文章主要介紹了C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息的相關(guān)資料,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

大城县| 如皋市| 会东县| 西贡区| 武胜县| 鸡东县| 正宁县| 巴楚县| 宁都县| 巨鹿县| 镇远县| 江北区| 雷波县| 浦北县| 河津市| 阿合奇县| 大洼县| 万源市| 宜黄县| 新蔡县| 汝州市| 临猗县| 嘉定区| 洱源县| 惠东县| 安国市| 洮南市| 原阳县| 常宁市| 伊金霍洛旗| 益阳市| 刚察县| 建德市| 天门市| 汶川县| 天津市| 高雄市| 罗甸县| 自贡市| 衡阳县| 社旗县|