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

旅途

如果想飛得高,就該把地平線忘掉

c與c++ static函數的區別

c 與c++ static 函數的區別
static
關鍵字是 C, C++ 中都存在的關鍵字 , 它主要有三種使用方式 , 其中前兩種只指在 C 語言中使用 , 第三種在 C++ 中使用 (C,C++ 中具體細微操作不盡相同 , 本文以 C++ 為準 ).
(1)
局部靜態變量
(2)
外部靜態變量 / 函數
(3)
靜態數據成員 / 成員函數
下面就這三種使用方式及注意事項分別說明
一、局部靜態變量
C/C++ , 局部變量按照存儲形式可分為三種 auto, static, register
(<C 語言程序設計 ( 第二版 )> 譚浩強 , 174-175 )
auto 類型 ( 普通 ) 局部變量相比 , static 局部變量有三點不同
1.
存儲空間分配不同
auto
類型分配在棧上 , 屬于動態存儲類別 , 占動態存儲區空間 , 函數調用結束后自動釋放 , static 分配在靜態存儲區 , 在程序整個運行期間都不釋放 . 兩者之間的作用域相同 , 但生存期不同 .
2. static
局部變量在所處模塊在初次運行時進行初始化工作 , 且只操作一次
3.
對于局部靜態變量 , 如果不賦初值 , 編譯期會自動賦初值 0 或空字符 , auto 類型的初值是不確定的 . ( 對于 C++ 中的 class 對象例外 , class 的對象實例如果不初始化 , 則會自動調用默認構造函數 , 不管是否是 static 類型 )
特點 : static 局部變量的”記憶性”與生存期的”全局性”
所謂”記憶性”是指在兩次函數調用時 , 在第二次調用進入時 , 能保持第一次調用退出時的值 .
示例程序一
#include <iostream>
using namespace std;
void staticLocalVar()
{
static int a = 0; //
運行期時初始化一次 , 下次再調用時 , 不進行初始化工作
cout<<"a="<<a<<endl;
++a;
}
int main()
{
staticLocalVar(); //
第一次調用 , 輸出 a=0
staticLocalVar(); //
第二次調用 , 記憶了第一次退出時的值 , 輸出 a=1
return 0;
}
應用 :
利用”記憶性” , 記錄函數調用的次數 ( 示例程序一 )
利用生存期的”全局性” , 改善” return a pointer / reference to a local object ”的問題 . Local object 的問題在于退出函數 , 生存期即結束 ,. 利用 static 的作用 , 延長變量的生存期 .
示例程序二 :
// IP address to string format
// Used in Ethernet Frame and IP Header analysis
const char * IpToStr(UINT32 IpAddr)
{
static char strBuff[16]; // static
局部變量 , 用于返回地址有效
const unsigned char *pChIP = (const unsigned char *)&IpAddr;
sprintf(strBuff, "%u.%u.%u.%u", pChIP[0], pChIP[1], pChIP[2], pChIP[3]);
return strBuff;
}

注意事項 :
1.
“記憶性” , 程序運行很重要的一點就是可重復性 , static 變量的”記憶性”破壞了這種可重復性 , 造成不同時刻至運行的結果可能不同 .
2.
“生存期”全局性和唯一性 . 普通的 local 變量的存儲空間分配在 stack , 因此每次調用函數時 , 分配的空間都可能不一樣 , static 具有全局唯一性的特點 , 每次調用時 , 都指向同一塊內存 , 這就造成一個很重要的問題 ---- 不可重入性 !!!
這樣在多線程程序設計或遞歸程序設計中 , 要特別注意這個問題 .
(
不可重入性的例子可以參見 <effective C++ (2nd)>( 影印版 ) 103-105 )
下面針對示例程序二 , 分析在多線程情況下的不安全性 .( 為方便描述 , 標上行號 )
const char * IpToStr(UINT32 IpAddr)
{
static char strBuff[16]; // static 局部變量 , 用于返回地址有效
const unsigned char *pChIP = (const unsigned char *)&IpAddr;
sprintf(strBuff, "%u.%u.%u.%u", pChIP[0], pChIP[1], pChIP[2], pChIP[3]);
return strBuff;
}
設現在有兩個線程 A,B 運行期間都需要調用 IpToStr() 函數 , 32 位的 IP 地址轉換成點分 10 進制的字符串形式 . A 先獲得執行機會 , 執行 IpToStr(), 傳入的參數是 0x0B090A0A, 順序執行完應該返回的指針存儲區內容是 : 10.10.9 .11 , 現執行到⑥時 , 失去執行權 , 調度到 B 線程執行 , B 線程傳入的參數是 0xA8A8A8C0, 執行至⑦ , 靜態存儲區的內容是 192.168.168.168. 當再調度到 A 執行時 , 從⑥繼續執行 , 由于 strBuff 的全局唯一性 , 內容已經被 B 線程沖掉 , 此時返回的將是 192.168.168.168 字符串 , 不再是 10.10.9.11 字符串 .

二、外部靜態變量/函數
C static 有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。但為了限制全局變量 / 函數的作用域 , 函數或變量前加 static 使得函數成為靜態函數。但此處“ static ”的含義不是指存儲方式,而是指對函數的作用域僅局限于本文件 ( 所以又稱內部函數 ) 。注意此時 , 對于外部 ( 全局 ) 變量 , 不論是否有 static 限制 , 它的存儲區域都是在靜態存儲區 , 生存期都是全局的 . 此時的 static 只是起作用域限制作用 , 限定作用域在本模塊 ( 文件 ) 內部 .
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
示例程序三 :

//file1.cpp

static int varA;
int varB;
extern void funA()
{
……
}

static void funB()
{
……
}

//file2.cpp

extern int varB; //
使用 file1.cpp 中定義的全局變量
extern int varA; //
錯誤 ! varA static 類型 , 無法在其他文件中使用
extern vod funA(); //
使用 file1.cpp 中定義的函數
extern void funB(); //
錯誤 ! 無法使用 file1.cpp 文件中 static 函數

三、靜態數據成員/成員函數 (C++ 特有 )
C+ +
重用了這個關鍵字,并賦予它與前面不同的第三種含義:表示屬于一個類而不是屬于此類的任何特定對象的變量和函數 . 這是與普通成員函數的最大區別 , 也是其應用所在 , 比如在對某一個類的對象進行計數時 , 計數生成多少個類的實例 , 就可以用到靜態數據成員 . 在這里面 , static 既不是限定作用域的 , 也不是擴展生存期的作用 , 而是指示變量 / 函數在此類中的唯一性 . 這也是”屬于一個類而不是屬于此類的任何特定對象的變量和函數”的含義 . 因為它是對整個類來說是唯一的 , 因此不可能屬于某一個實例對象的 . ( 針對靜態數據成員而言 , 成員函數不管是否是 static, 在內存中只有一個副本 , 普通成員函數調用時 , 需要傳入 this 指針 , static 成員函數調用時 , 沒有 this 指針 . )
請看示例程序四 (<effective c++ (2nd)>( 影印版 ) 59 )
class EnemyTarget {
public:
EnemyTarget() { ++numTargets; }
EnemyTarget(const EnemyTarget&) { ++numTargets; }
~EnemyTarget() { --numTargets; }
static size_t numberOfTargets() { return numTargets; }
bool destroy(); // returns success of attempt to destroy EnemyTarget object
private:
static size_t numTargets; // object counter
};
// class statics must be defined outside the class;
// initialization is to 0 by default
size_t EnemyTarget::numTargets;

在這個例子中 , 靜態數據成員 numTargets 就是用來計數產生的對象個數的 .
另外 , 在設計類的多線程操作時 , 由于 POSIX 庫下的線程函數 pthread_create() 要求是全局的 , 普通成員函數無法直接做為線程函數 , 可以考慮用 Static 成員函數做線程函數 .

posted on 2007-09-06 01:58 旅途 閱讀(1096) 評論(0)  編輯 收藏 引用 所屬分類: C/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>
            亚洲美女黄色| 好吊妞**欧美| 亚洲欧美国内爽妇网| 亚洲伦理精品| 一区二区三区四区五区精品视频| 亚洲欧洲精品一区二区精品久久久| 欧美一区二区三区精品| 欧美在线观看一区二区| 久久久www成人免费毛片麻豆| 久久精品视频一| 久久精品久久99精品久久| 欧美伊人久久久久久久久影院 | 欧美先锋影音| 国产精品实拍| 影音先锋日韩精品| 中文精品一区二区三区| 久久岛国电影| 亚洲国产欧美日韩| 欧美一区二区高清| 欧美电影免费观看高清完整版| 国产精品久久久久久模特| 好看的日韩av电影| 一区二区三区www| 久久免费高清视频| 亚洲精品孕妇| 久久精品视频亚洲| 欧美日韩人人澡狠狠躁视频| 国产一区二区三区观看| 99国产精品久久| 久久精品视频在线| 一本久久综合亚洲鲁鲁五月天| 久久久av毛片精品| 国产欧美在线视频| 亚洲一区二区三区高清| 欧美成人精品一区二区三区| 亚洲欧美国产日韩天堂区| 欧美激情综合色综合啪啪| 韩日欧美一区二区| 午夜激情综合网| 亚洲欧洲在线一区| 久久婷婷国产综合国色天香 | 亚洲国产精品一区二区www| 一区二区三区国产盗摄| 欧美成人免费在线| 欧美在线视频日韩| 国产精品久久| 亚洲午夜精品久久久久久浪潮| 免费美女久久99| 欧美一区二区视频在线| 国产精品综合色区在线观看| 午夜精品美女久久久久av福利| 日韩视频精品在线观看| 亚洲性视频网址| 欧美日本不卡| 99这里只有久久精品视频| 欧美激情麻豆| 免费日韩一区二区| 亚洲国产精品99久久久久久久久| 久久久久久久性| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩在线观看视频| 一本色道**综合亚洲精品蜜桃冫 | 亚洲无毛电影| 亚洲精品免费电影| 欧美日韩精品久久久| 亚洲一区二区三区在线视频| 99视频有精品| 国产精品国产三级国产专区53| 亚洲一二三区精品| 亚洲女同同性videoxma| 国产精品美女视频网站| 欧美在线免费视频| 久久精品电影| 亚洲国产日韩一区二区| 亚洲人成人99网站| 国产精品久久毛片a| 久久亚洲视频| 欧美精品v国产精品v日韩精品| 国产精品99久久久久久久女警| 99国产一区| 国产亚洲欧美一区二区三区| 麻豆久久久9性大片| 欧美激情91| 性欧美1819性猛交| 久久这里只有| 亚洲男人第一av网站| 久久精品最新地址| 在线亚洲欧美视频| 久久精品av麻豆的观看方式| 亚洲精品综合精品自拍| 午夜亚洲性色福利视频| 亚洲激情偷拍| 午夜精品一区二区三区电影天堂| 伊人久久婷婷| 亚洲无线视频| 亚洲日本va午夜在线电影| 亚洲永久免费| 9色国产精品| 久久久噜噜噜久久狠狠50岁| 亚洲一区3d动漫同人无遮挡| 久久久夜色精品亚洲| 亚洲婷婷综合久久一本伊一区| 久久精品99国产精品| 国产精品99久久久久久人| 久久手机精品视频| 欧美一区二区三区在线视频| 欧美激情中文不卡| 男人天堂欧美日韩| 国产亚洲观看| 亚洲四色影视在线观看| 欧美成人免费小视频| 国产欧美丝祙| 一本一本大道香蕉久在线精品| 亚洲国产成人精品视频| 亚洲无线一线二线三线区别av| 亚洲狼人综合| 免费av成人在线| 久久综合九色九九| 国产一区二区三区久久久久久久久| 99riav国产精品| av成人国产| 免费国产一区二区| 另类亚洲自拍| 国内成+人亚洲+欧美+综合在线| 在线视频中文亚洲| 亚洲一线二线三线久久久| 欧美精品成人在线| 91久久精品国产91性色tv| 91久久精品国产91性色| 久久一区二区三区国产精品 | 99re成人精品视频| 亚洲日本视频| 欧美成人在线免费视频| 欧美91大片| 亚洲激情在线观看视频免费| 蜜乳av另类精品一区二区| 欧美成人亚洲| 亚洲精品视频在线| 欧美日韩成人一区二区三区| 日韩视频一区二区| 亚洲欧美清纯在线制服| 国产精品视频1区| 欧美在线一级视频| 嫩草成人www欧美| 日韩亚洲欧美中文三级| 欧美日韩一区二区三区四区五区| 亚洲美女中出| 久久er精品视频| 在线观看久久av| 欧美黄在线观看| 亚洲一区二区三区久久| 久久精品国产77777蜜臀| 依依成人综合视频| 欧美激情精品久久久久久久变态| 亚洲免费激情| 久久久精品tv| 亚洲精品美女在线| 国产精品青草久久久久福利99| 久久国产手机看片| 亚洲精品韩国| 久久久久国产精品麻豆ai换脸| 亚洲国产裸拍裸体视频在线观看乱了中文 | 毛片精品免费在线观看| 亚洲人体影院| 国产欧美日韩视频一区二区| 亚洲激情电影中文字幕| 欧美日韩国产欧美日美国产精品| 亚洲视频一起| 欧美不卡激情三级在线观看| 亚洲午夜91| 激情五月婷婷综合| 欧美日韩另类一区| 久久精品一区二区| 日韩视频免费大全中文字幕| 久久久99精品免费观看不卡| 日韩一级免费观看| 好吊日精品视频| 国产精品高潮呻吟久久| 久久视频一区| 午夜精品福利一区二区蜜股av| 欧美国产综合| 久久精品国产综合精品| 亚洲一区视频在线观看视频| 亚洲国产精品久久人人爱蜜臀 | 亚洲欧美日韩中文在线制服| 亚洲电影观看| 国产亚洲一级高清| 国产精品国产成人国产三级| 免费中文日韩| 久久疯狂做爰流白浆xx| 一区二区国产日产| 亚洲国产三级在线| 免费观看亚洲视频大全| 久久久久久69| 欧美一区二区三区在线看 | 久久国产精品99国产精| 亚洲午夜免费视频| 一个人看的www久久| 亚洲欧洲三级| 亚洲欧洲一区二区三区在线观看 |