日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小议 static 关键字

發布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小议 static 关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.靜態全局變量: 只作用域本文件,其它文件extern也不行

file1.c

?

[cpp]?view plaincopyprint?
  • #include?<stdio.h>??
  • static?int?i?=?0;??
  • file2.c

    ?

    ?

    [cpp]?view plaincopyprint?
  • #include?<stdio.h>??
  • extern?int?i;??
  • int?main(int?argc,?const?char?*argv[])???
  • {??
  • ????printf("%d\n",?i);???
  • ????return?0;??
  • }??
  • gcc *.c ->

    ?

    ?

    [cpp]?view plaincopyprint?
  • ./tmp/ccftYQ26.o:?In?function?`main':??
  • w2.c:(.text+0xb):?undefined?reference?to?`i'??
  • collect2:?ld?returned?1?exit?status??
  • /#?????????
  • ?

    ?

    2.靜態局部變量?

    由于static定義或聲明的變量存儲在內存的靜態區, 而不是存儲在棧中, 所以出了這個作用域后

    {

    ? ? static int i = 1;

    ? ? i++;

    }

    變量i不會銷毀, 再次進入也不會被重新定義,而是使用原來的值,不過這個作用域是局部的.也就是在其它作用域定義個靜態i , 和 第一個靜態i 不是同一塊內存.?

    這里有點要注意,再次進入這個作用域, static int i = 1; 其實只起到聲明作用 .只是告訴你這里面有這個符號而已. 沒有起到賦值作用.?

    看下面的程序:

    ?

    [cpp]?view plaincopyprint?
  • static?int?j?;???
  • void?test()?{??
  • ????static?int?i?=?1;?//相當于聲明??
  • ????i++;??
  • ????printf("i=%d\n",?i);???
  • }??
  • void?test2()?{??
  • ????j?=?0;????//每次進入這個作用域?都會被重新賦值下??
  • ????j++;??
  • ????printf("j=%d\n",?j);???
  • }??
  • ??
  • int?main(int?argc,?const?char?*argv[])???
  • {??
  • ????int?k?=?0;??
  • ????for?(;?k<10;?k++)?{??
  • ????????test();??
  • ????????test2();??
  • ????}?????
  • ????return?0;??
  • }??

  • 3.修飾函數, 修飾函數不同于修飾變量, 有一點相同就是, 只作用域本文件, 和存儲方式無關(靜態存儲區). 這個作用很大, 和 C++的namespace作用相當!

    ?

    ?

    4. C++ 修飾成員變量, 所有對象共享靜態成員

    ?

    [cpp]?view plaincopyprint?
  • class?Test?{??
  • ??
  • ????public:??
  • ????????Test(int?j,?int?k);???
  • ????????void?GetI()?{?cout<<i<<endl;?}??????
  • ????private:??
  • ????????int?j,?k;??
  • ????????static?int?i;?//靜態成員,非全局的??
  • };??
  • ??
  • int?Test::i?=?0;??
  • ??
  • Test::Test(int?j,?int?k)?{??
  • ????this->j?=?j;??
  • ????this->k?=?k;??
  • ????i?=?j?+?k;??
  • }??
  • ??
  • int?main(int?argc,?const?char?*argv[])???
  • {??
  • ????Test?a(1,?2);???
  • ????a.GetI();??
  • ????Test?b(2,?3);???
  • ????b.GetI();??
  • ????a.GetI();??
  • ????return?0;??
  • }??
  • ?

    ?

    5.靜態成員函數

    靜態成員函數不能調用非靜態成員, 因為它沒有this ,非靜態成員需要對象才能調用. ?正因為沒有this,所以速度上有少許的增長, 當然靜態成員函數也是可以用對象來調用的.

    ?

    [cpp]?view plaincopyprint?
  • class?Test?{??
  • ??
  • ????public:??
  • ????????Test(int?j,?int?k);??
  • ????????static?void?GetI()?{?cout<<i<<endl;?}??
  • ????????static?void?test()?;??
  • ????private:??
  • ????????int?j,?k;??
  • ????????static?int?i;??
  • ??
  • };??
  • ??
  • int?Test::i?=?0;??
  • ??
  • Test::Test(int?j,?int?k)?{??
  • ????this->j?=?j;??
  • ????this->k?=?k;??
  • ????i?=?j?+?k;??
  • }??
  • ??
  • void?Test::test()?{??
  • ????GetI();??
  • }??
  • ??
  • int?main(int?argc,?const?char?*argv[])??
  • {??
  • ????Test?a(1,2);??
  • ????a.test();??
  • ????Test::test();??
  • ????return?0;??
  • }??

  • 6.默認初始化為0 , 由于存儲在靜態區包括全局變量, 會默認初始化為0?

    ?

    轉載于:https://www.cnblogs.com/10jschen/archive/2012/08/22/2650150.html

    總結

    以上是生活随笔為你收集整理的小议 static 关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。