【關鍵字】static 使用總結_c++ static關鍵字-CSDN博客
本文來自上面的文章,這里用于學習,謝謝大佬的分享!!!
非原創!!!
1.一個項目中創建main.cpp和demo.cpp
(1)main.cpp和demo.cpp中都寫入:
void func(){
cout<<"hello"<<endl;
}
編譯報錯?
(2)在一個文件中定義函數,在另一個文件中引入該函數的聲明。
main.cpp
void func(){
cout<<"hello"<<endl;
}
demo.cpp
extern void func();
?可以!
(3)只希望func()函數在main.cpp中使用,不可以被demo.cpp使用。
main.cpp
static void func(){
cout<<"hello"<<endl;
}
添加static關鍵字,此時函數為靜態函數,作用域由之前的整個項目內的文件變為只能在本文件內訪問。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
此時可以在demo.cpp中定義同名函數func(),因為作用域不同,互不影響。
2.在全局變量前添加static
作用域縮小為只能在本文件中訪問,生命周期不變。
全局變量在外部文件中可以使用extern訪問,但全局靜態變量在外部不可訪問。
3.局部變量前添加static
局部變量生命周期變為與全局變量一致,隨進程一起結束,作用域不變。
4.類的靜態成員變量
該靜態變量只能在類內部定義,外部聲明。
class A
{
public:static int n;
};// 類的靜態成員變量只能在類外部定義(類外部定義時不能加static關鍵字),類內部聲明
int A::n = 10;int main()
{// 1、通過示例對象訪問靜態成員變量A a;cout << a.n << endl;// 輸出10// 2、因為類的靜態成員變量是所有該類的對象所共享的// 所以也可以通過類名直接訪問cout << A::n <<endl;// 輸出10return 0;
}
靜態成員變量必須設初值,否則編譯失敗。
私有(保護)靜態成員變量不可通過類名::變量名訪問
5.類的靜態成員函數
函數內部只能訪問類的靜態成員。
(1)類內部,外部都可以定義類的靜態成員函數
class A{
public:
static void try()
{
cout<<"hello"<<endl;
}
}
class A{
public:
static void try();
}
void A::try()
{
cout<<"hello"<<endl;
}
? ?(2)靜態成員函數沒有this指針,不可訪問非靜態成員。
? ?(3)static成員函數不能被virtual修飾。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
虛函數的實現是為每一個對象分配一個vptr指針,vptr通過this指針來調用。
虛函數調用關系:this->vptr--->ctable--->virtual function