C++ const關(guān)鍵字的實例用法
C++中的const更像編譯階段的#define
const int m = 10; int n = m;
變量是要占用內(nèi)存的,即使被const修飾也不例外。m,n兩個變量占用不同的內(nèi)存,int n = m;表示將m的值賦給n。
- 在C語言中,編譯器會先到m所在的內(nèi)存取出一份數(shù)據(jù),再將這份數(shù)據(jù)賦給n;
- 在C++中,編譯器會直接將10賦給m,沒有讀取內(nèi)存的過程,和int n = 10效果一樣。
- 在C++中的常量更類似于#define命令,是一個值替換的過程,只不過#define是在預(yù)處理階段替換,而常量是在編譯階段替換。
C++中的const
- 優(yōu)點:提高了程序執(zhí)行效率
- 缺點:不能反映內(nèi)存的變化,一旦const變量被修改,C++就不能取得最新的值。
const變量禁止被修改 --- 只是語法層面上的限制,通過指針仍然可以修改。
#include <stdio.h>
int main(){
const int n = 10;
//注意:&n得到的指針的類型是const int*,必須強制轉(zhuǎn)換為int*后才能賦給p,否則類型是不兼容的。
int *p = (int*)&n; //必須強制類型轉(zhuǎn)換
*p = 99; //修改const變量的值
printf("%d\n", n);
return 0;
}
//以C語言的方式編譯,運行結(jié)果是99
//以C++的方式編譯,運行結(jié)果是10
//在C語言中,輸出n時會到內(nèi)存中獲取n的值,這個時候n所在的內(nèi)存中的數(shù)據(jù)已經(jīng)被修改成了99
//在C++中,print("%d\n", n);語句在編譯時就將n的值替換成了10,不管n所在內(nèi)存如何變化,都不影響輸出結(jié)果。
C++中全局const變量的可見范圍是當(dāng)前文件
普通全局變量的作用域是當(dāng)前文件,但是在其他文件中也是可見的,使用extern聲明后就可以使用。
/*源文件1*/
#include <stdio.h>
#include"func.cpp"
int n = 10;
void func();
int main(){
func();
printf("main: %d\n", n);
return 0;
}
/*源文件2*/
#include <stdio.h>
extern int;
void func();
{
printf("module: %d\n", n);
}
/*運行結(jié)果:*/ module:10 main:10 //在C語言中,const變量和普通變量一樣,在其他源文件中也是可見的。 const int n = 10; //在C語言中的const變量在多文件編譯時的表現(xiàn)和普通變量一樣,除了不能修改,沒有其他區(qū)別。 //在C++中,修改后的代碼是錯誤的。
C++規(guī)定全局const變量的可見范圍僅限于當(dāng)前源文件,所以可以將它放在頭文件中,這樣即使頭文件被包含多次也不會出錯。
總結(jié):
C++中的const變量雖然也會占用內(nèi)存,也能使用&獲取它的地址,但是使用時卻更像編譯時期的#define;
#define也是值替換,可見范圍也是當(dāng)前文件;
#define定義的常量僅僅是字符串的替換,不會進(jìn)行類型檢查,
而const定義的常量是有類型的,編譯器會進(jìn)行類型檢查。
知識點補充:
const修飾函數(shù)參數(shù)
const修飾參數(shù)是為了防止函數(shù)體內(nèi)可能會修改參數(shù)原始對象。因此,有三種情況可討論:
- 函數(shù)參數(shù)為值傳遞:值傳遞(pass-by-value)是傳遞一份參數(shù)的拷貝給函數(shù),因此不論函數(shù)體代碼如何運行,也只會修改拷貝而無法修改原始對象,這種情況不需要將參數(shù)聲明為const。
- 函數(shù)參數(shù)為指針:指針傳遞(pass-by-pointer)只會進(jìn)行淺拷貝,拷貝一份指針給函數(shù),而不會拷貝一份原始對象。因此,給指針參數(shù)加上頂層const可以防止指針指向被篡改,加上底層const可以防止指向?qū)ο蟊淮鄹摹?/li>
- 函數(shù)參數(shù)為引用:引用傳遞(pass-by-reference)有一個很重要的作用,由于引用就是對象的一個別名,因此不需要拷貝對象,減小了開銷。這同時也導(dǎo)致可以通過修改引用直接修改原始對象(畢竟引用和原始對象其實是同一個東西),因此,大多數(shù)時候,推薦函數(shù)參數(shù)設(shè)置為pass-by-reference-to-const。給引用加上底層const,既可以減小拷貝開銷,又可以防止修改底層所引用的對象。
以上就是C++ const關(guān)鍵字的實例用法的詳細(xì)內(nèi)容,更多關(guān)于C++ const關(guān)鍵字請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++中靜態(tài)成員函數(shù)訪問非靜態(tài)成員的實例
這篇文章主要介紹了C++中靜態(tài)成員函數(shù)訪問非靜態(tài)成員的實例的相關(guān)資料,需要的朋友可以參考下2017-07-07
Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)
下面小編就為大家?guī)硪黄狶inux下C語言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
C++實現(xiàn)地鐵自動售票系統(tǒng)程序設(shè)計
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)地鐵自動售票系統(tǒng)程序設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
C++實現(xiàn)LeetCode(123.買股票的最佳時間之三)
這篇文章主要介紹了C++實現(xiàn)LeetCode(123.買股票的最佳時間之三),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Java?C++?算法題解leetcode652尋找重復(fù)子樹
這篇文章主要為大家介紹了Java?C++?算法題解leetcode652尋找重復(fù)子樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
在C++程序中開啟和禁用Windows設(shè)備的無線網(wǎng)卡的方法
這篇文章主要介紹了在C++程序中開啟和禁用Windows設(shè)備的無線網(wǎng)卡的方法,包括一些常見錯誤的分析與解決,需要的朋友可以參考下2016-03-03
C++高精度計時的幾種方法總結(jié)(測試函數(shù)運行時間)
本文介紹了C++中常用的幾種程序計時方法,包括clock()函數(shù)、GetTickCount()、QueryPerformanceCounter()以及C++11中的chrono庫函數(shù),這篇文章主要介紹了C++高精度計時的幾種方法,需要的朋友可以參考下2024-09-09

