--------siwuxie095 ios
控制變化的 const: 函數
1、const 與基本數據類型 spa
2、const 與指針類型 3d
3、const 與引用 指針
const 與基本數據類型: blog
先看沒有 const 以前:定義一個 x,及其內存表示 內存
當加上 const 後:由 變量 變成了 常量,x 就沒法再獲得更改, 編譯器
若是再給 x 賦值 5,就會報錯,沒法經過編譯 it
const 與指針類型: io
const 與指針類型的關係 比 const 與普通數據類型的關係要複雜
先看與一重指針的相關狀況:
const 能夠放在數據類型的前面,也能夠放在數據類型的後面
兩者徹底等價
但將 const 寫在 * 後面,又有所不一樣
const 除了 加一處 以外,也能夠 兩處都加
如:
定義 x,賦值 3,const int *p 指向 x 後,若是 p 再去指向
另外一個地址 &y,是能夠的。由於 const 此時修飾的是 *p,
若是經過 *p 進行從新賦值,是錯誤的
再如:
此時 const 寫在 * 後,就意味着 const 所修飾的 p 就只能
指向一個地址,不能再進行變化。若是使用 p 再去指向 y
的地址 &y,編譯器將提示錯誤
再如:
若是在一個指針的先後,都使用了 const,就意味着當使用 p
指向 x 以後,就不能再經過 p 來修改 x 自己的值,也不能將 p
指向其餘的變量
const 與引用:
如:
定義 x,賦值 3,const 定義一個引用 &y,y 是 x 的別名
若是給 x 賦值 10,是正確的,由於 x 是可變的
若是給 y 賦值 20,是有問題的,由於 y 做爲 x 的別名,
前面加了修飾符 const,因此經過 y 來修改是有問題的,
但經過 x 做修改是容許的
const 示例,如下都會報錯:
const 示例,對比:
第一個是有問題的,x 是不可變的,而指針 y 倒是可變的,
若是定義一個可變的指針去指向一個不可變的變量,就意味
着有風險,即 能夠經過 *y 的方式,來改變 x 的值,這對計
算機來講風險太大,編譯器是禁止的
而第二個則沒問題,x 可變,而指針 y 所指向的位置不可變,
x 自己具備 讀 和 寫 兩種權限,而指針 y 只具備 讀 權限,就
意味着用一個權限小的來接收一個權限大的變量,是容許的
程序:
#include <stdlib.h> #include<iostream> using namespace std;
int main(void) { //假如定義了一個const int x=3; //其實至關於宏定義 #define X 3 (宏定義方式定義常量) int x = 3; int y = 5; const int *p = &x;//等價於 const int *p=&x; cout << *p << endl; x = 10;//此時指針p不能夠賦值 如 *p=10; 是錯誤的 cout << *p << endl; p = &y;//但卻能夠指向其餘變量 cout << *p << endl; system("pause"); return 0; }
//int main(void) //{ // int x = 3; // int y = 5; // int *const p = &x; // *p = 10;//此時指針p能夠賦值 但卻不能夠指向其餘變量 如 p=&y; 是錯誤的 // cout << *p << endl; // system("pause"); // return 0; //}
//int main(void) //{ // int x = 3; // int y = 5; // //此時指針p既不能賦值(如 *p=10;) 也不能指向其餘變量(如 p=&y;) // cout << *p << endl; // const int *const p = &x; // system("pause"); // return 0; //}
//const與引用 //int main(void) //{ // int x = 3; // int y = 5; // const int &z = x;//等價於 int const &z=x; // x = 10;//此時不能給引用z賦值 如 z=10; 是錯誤的 // cout << z << endl; //}
//函數中的const //void fun(const int &a, const int &y); //int main(void) //{ // int x = 3; // int y = 5; // fun(x, y); // cout << x << "," << y << endl; // system("pause"); // return 0; //} // //保證了傳入函數內部的變量不會因爲函數的誤操做而改變變量的值 下面的即爲誤操做 //void fun(const int &a, const int &y) //{ // /*a = 10; // b = 20;*/ //} |
vs2013中:
【made by siwuxie095】