在C語言編程中,static的一個(gè)作用是信息屏蔽! 比方說,你自己定義了一個(gè)文件?--?該文件中有一系列的函數(shù)以及變量的聲明和定義! 你希望該文件中的一些函數(shù)和變量只能被該文件中的函數(shù)使用,那么,你可以在該函數(shù)、變量的前面加上static,代表他們只能被當(dāng)前文件中的函數(shù)使用! 而在C++中,用static來作為信息屏蔽就顯得沒有必要了!因?yàn)?,C++有了信息屏蔽的利器?--?class機(jī)制! 類中的private屬性的變量和函數(shù)就對外禁止訪問! 然后是C/C++通用的函數(shù)作用域的static型的變量!其目的,也是為了信息的屏蔽! int?fun()?{ ???static?int?a?=?1; ???a++; } 在第一次進(jìn)入這個(gè)函數(shù)的時(shí)候,變量a被初始化為1!并接著自增1! 以后每次進(jìn)入該函數(shù),a就不會(huì)被再次初始化了,僅進(jìn)行自增1的操作! 在static發(fā)明前,要達(dá)到同樣的功能,則只能使用全局變量: int?a?=?1; int?fun()?{ ???a++; } 那么,a的值就有可能被其他函數(shù)所改變! 最后,說說類中的static變量和函數(shù)。 這種存儲(chǔ)屬性的變量和函數(shù)是同一種類的不同實(shí)例之間通信的橋梁! #include?<iostream> using?namespace?std; class?A?{ public: ????static?int?num;????//????統(tǒng)計(jì)創(chuàng)建了多少個(gè)實(shí)例 ????A?()?{num++};????//????每創(chuàng)建一個(gè)實(shí)例,就讓num自增1 ????//????返回通過構(gòu)造函數(shù)所創(chuàng)建過的A類實(shí)例的數(shù)目 ????static?int?how_many_instance()?{ ????????return?num; ????} } static?A::num?=?0;????//????需要在類申明的外部單獨(dú)初始化! int?main()?{ ????cout?<<?A::how_many_instance()?<<?endl; ????A?a,?b,?c,?d; ????cout?<<?A::how_many_instance()?<<?endl; ????system("pause"); } 一般,在類內(nèi)部,是通過static屬性的函數(shù),訪問static屬性的變量! 補(bǔ)充一點(diǎn),在類中,static型的成員函數(shù),由于是類所擁有的,而不是具體對象所有的,這一點(diǎn)對于windows的回調(diào)機(jī)制非常有用。 因?yàn)閷τ诨卣{(diào)函數(shù)而言,windows不會(huì)借助任何對象去調(diào)用它,也就不會(huì)傳遞this指針,那么對于一般成員函數(shù)作為回調(diào)函數(shù)的后果,就是堆棧中有一個(gè)隨機(jī)的變量會(huì)成為this指針,這當(dāng)然會(huì)引發(fā)程序的崩潰。 而static函數(shù),由于是整個(gè)類的,屏蔽了this指針。因此,如果成員函數(shù)作為回調(diào)函數(shù),就應(yīng)該用static去修飾它。 |
Feedback
有沒有考慮過,Static是如何實(shí)現(xiàn)的?
內(nèi)存和其他有何區(qū)別?
內(nèi)存和其他有何區(qū)別?
作為一位程序員,應(yīng)對自己的源代碼持有最謹(jǐn)慎的態(tài)度
#include <iostream>
using namespace std;
class A {
public:
static int num; // 統(tǒng)計(jì)創(chuàng)建了多少個(gè)實(shí)例
A () {
num++;
} // 每創(chuàng)建一個(gè)實(shí)例,就讓num自增1
// 返回通過構(gòu)造函數(shù)所創(chuàng)建過的A類實(shí)例的數(shù)目
static int how_many_instance() {
return num;
}
};
int A::num = 0; // 需要在類申明的外部單獨(dú)初始化!
int main() {
cout << A::how_many_instance() << endl;
A a, b, c, d;
cout << A::how_many_instance() << endl;
system("pause");
return 0;
}
using namespace std;
class A {
public:
static int num; // 統(tǒng)計(jì)創(chuàng)建了多少個(gè)實(shí)例
A () {
num++;
} // 每創(chuàng)建一個(gè)實(shí)例,就讓num自增1
// 返回通過構(gòu)造函數(shù)所創(chuàng)建過的A類實(shí)例的數(shù)目
static int how_many_instance() {
return num;
}
};
int A::num = 0; // 需要在類申明的外部單獨(dú)初始化!
int main() {
cout << A::how_many_instance() << endl;
A a, b, c, d;
cout << A::how_many_instance() << endl;
system("pause");
return 0;
}
只有注冊用戶登錄后才能發(fā)表評論。 | ||
【推薦】100%開源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|