<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
先看一個典型的程式:
#include<iostream> using namespace std; int main() { int num = 1; #define t1 num + num #define t2 t1 % t1 cout << "t2 is " << t2 << endl; // t2 is 2 const int s1 = num + num; const int s2 = s1 % s1; cout << "s2 is " << s2 << endl; // s2 is 0 return 0; }
執行結果如註釋所示,分別得到“t2 is 2”、“s2 is 0”???
分析原因:const定義的常數s1、s2,則s1的值是num+num,s2的值是s1%s1,所以最後結果為“s2 is 0”;而define定義的變數作替換後,C++把cout<<"t2 is "<<t2<<endl;語句譯成了:cout<<"t2 is "<<num+num%num+num<<endl;所以結果為“t2 is 2”(1+0+1=2)
注意:define定義的內容,建議增加使用括號()
#define t1 (num + num) #define t2 (t1 % t1)
具體分析define與const的區別,如下定義:
const float PI = 3.14; #define PI (3.14)
const約束物件的存取性質:使得物件只能讀,不能寫:不允許修改物件的值.
const 是constant 的縮寫,“恆定不變”的意思。被const 修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。所以很多C++程式設計書籍建議:“Use const whenever you need”。
const int n=5; int const n=5;
這兩種寫法是一樣的,都是表示變數n的值不能被改變了,需要注意的是,用const修飾變數時,一定要給變臉初始化,否則之後就不能再進行賦值了。
// C const int num = 100; (int *)&num = 4; //可以間接修改
C的const表示修飾唯讀變數,但是我們可以惡意強制操作const物件。
接下來看看const用於修飾常數靜態字串,例如:
const char* str="fdsafdsa";
如果沒有const的修飾,我們可能會在後面有意無意的寫str[4]=’x’這樣的語句,這樣會導致對唯讀記憶體區域的賦值,然後程式會立刻異常終止。有了const,這個錯誤就能在程式被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發現。
如下修改都是不允許的。
// c++ const int i = 0; //是一個右值,有記憶體實體 i = 11; //錯誤:向唯讀變數‘i'賦值 const int a{1.1}; //錯誤:從「double」轉換到「int」需要收縮轉換,請初始化成相同型別的常數
常數指標是指標指向的內容是常數,可以有一下兩種定義方式。
const int * n; int const * n;
需要注意的是一下兩點:
1、常數指標說的是不能通過這個指標改變變數的值,但是還是可以通過其他的參照來改變變數的值的。
int a=5; const int* n=&a; a=6;
指標常數是指指標本身是個常數,不能在指向其他的地址,寫法如下:
int *const n;
需要注意的是,指標常數指向的地址不能改變,但是地址中儲存的數值是可以改變的,可以通過其他指向改地址的指標來修改。
int a=5; int *p=&a; int* const n=&a; *p=8;
注意:區分常數指標和指標常數的關鍵就在於星號的位置,我們以星號為分界線,如果const在星號的左邊,則為常數指標,如果const在星號的右邊則為指標常數。如果我們將星號讀作‘指標’,將const讀作‘常數’的話,內容正好符合。int const * n;是常數指標,int *const n;是指標常數。
指向常數的常指標
是以上兩種的結合,指標指向的位置不能改變並且也不能通過這個指標改變變數的值,但是依然可以通過其他的普通指標改變變數的值。
const int* const p;
根據常數指標與指標常數,const修飾函數的引數也是分為三種情況。
1、防止修改指標指向的內容
void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是輸入引數,strDestination 是輸出引數。給 strSource 加上 const 修飾後,如果函數體內的語句試圖改動 strSource 的內容,編譯器將指出錯誤。
2、防止修改指標指向的地址
void swap ( int * const p1 , int * const p2 )
指標p1和指標p2指向的地址都不能修改。
3、以上兩種的結合。
如果給以“指標傳遞”方式的函數返回值加 const 修飾,那麼函數返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。
例如函數:
const char * GetString(void);
如下語句將出現編譯錯誤:
char *str = GetString();
正確的用法是
const char *str = GetString();
全域性變數的作用域是整個檔案,我們應該儘量避免使用全域性變數,因為一旦有一個函數改變了全域性變數的值,它也會影響到其他參照這個變數的函數,導致除了bug後很難發現,如果一定要用全域性變數,我們應該儘量的使用const修飾符進行修飾,這樣防止不必要的人為修改,使用的方法與區域性變數是相同的。
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45