const,static,全局變量細節及其區別

const:

限制符號,限制某個變量所指向的內容不能通過這個對象修改。

但是可以通過其他的修改,比如:

int main(){
   int x=5;
   const int &y=x;
   x++;
   cout<<y<<" "<<x;
    return 0;
}

結果如下:

但是如果這樣就通不過編譯了

所以,const的作用是限制申明出來的變量的權限,所以我們有這麼一個等式:

權限小=權限大 權限大!=權限小

什麼意思呢:如下:

int main(){
   int x=5;
   const int* y=&x;
   x++;
   cout<<*y<<" "<<x;
    return 0;
}

上式是可以通過編譯的,結果爲6 6.我們將一個權限大的變量x賦值了一個常量指針指向它。同上x可以改變該變量的值,*y不能,但如果向下式子就不能通過編譯了:

int main(){
   const int x=5;
   int* y=&x;
   x++;
   cout<<*y<<" "<<x;
    return 0;
}

因爲我們將一個權限是隻讀的變量讓正常指針指向(賦值是可以的,指針引用不行),無意間擴大了它的權限,這樣對於計算機而言意味着風險,所以編譯器會禁止這種做法

const最後一個問題是const與指針的問題,const出現在*號前,代表這個指針只能指向常量,出現在*號後,代表這個指針只能指向那塊區域,但是那塊區域的值可以改動,如下:

int main(){
    const int y=5;
    int z=0;
   const int* x=&y;
   x=&z;
   cout<<*x<<" "<<x;
    return 0;
}

*x爲0;

int main(){
    const int y=5;
    int z=0;
    int const* x=&y;
   x=&z;
   cout<<*x<<" "<<x;
    return 0;
}

結果同上

int main(){
    int y=5;
    int z=0;
    int * const x=&y;
    x=&z;
   cout<<*x<<" "<<x;
    return 0;
}

這個式子編譯就不過了,但是這樣可以:

int main(){
    int y=5;
    int z=0;
    int * const x=&y;
    (*x)++;
   cout<<*x<<" "<<x;
    return 0;
}

static:

static作用有以下兩個:

1.規定變量作用區域,就是變量所在的函數或類(同於局部變量),只有在該函數/類才能調用。被static申明的變量只能在該文件被調用!

2.規定變量的存儲地址(也就是確定了其生存期),static變量存在靜態區域,不是在棧空間,函數/類執行完畢後不會被回收,且其值會一直保留,直至程序結束

全局變量:

全局變量就是靜態變量少了第一個約束,它可以被任意的類或函數調用

static的全局變量:

作用是聲明瞭一個全局變量,但是它只能在該文件內被使用,外部無法使用。下面詳細介紹一下該類變量,並引入內外部鏈接及extern的使用。

注:關於編譯鏈接這塊的理解僅個人理解,可能有問題,若理解有問題請指出

編譯的作用範圍:一個文件(即一個.c或者一個.cpp)

鏈接:將不同的cpp組裝,如將函數聲明和代碼實現拼接

內連接:文件內部的組裝

外連接:不同文件間的組裝,extern其實就是外連接

假設我們有兩個文件a.cpp和b.cpp

分別如下:

//a.cpp
#include<iostream>
int num=9;
//b.cpp
#include<iostream>
extern int num;
cout<<num<<endl;

這樣,在b.cpp中,就可以直接使用num變量且改變a中的num和b中的num效果相同,extern不分配空間!

但是如果在b中extern int num=8;就會報錯了

那麼當我們定義的全局變量不想被其他文件所使用怎麼辦?

用static修飾!,如下:

//a.cpp
#include<iostream>
static int num=9;
//b.cpp
#include<iostream>
extern int num;
cout<<num<<endl;

這樣就不能通過編譯了,因爲在連接時候,a中的變量num對b來說不可見
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章