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來說不可見