const在C与C++中的区别
1、const用于C –> 運行時常量
a. 修飾變量
修飾變量為常變量(只讀變量)
此時i還是一個變量,不信你可以把它用來當作定義一個數組時的數組長度,一定會報錯。不過它具有一種常屬性,它的值一直都是10,不是發生改變(當然有人會說我有辦法使它改變),因此我們說它是常變量,或叫作只讀變量,因此我們一定要記住在定義只讀變量時要把它初始化為我們想要的值。
因此我們的代碼中千萬不要出現這種低級錯誤,數組的長度是一個常量表達式,盡管const修飾的變量是一個常變量,但它本質上仍然是一個變量:
int a = 10; int arr[a] = { 0 };前面說了,此時i的值其實有辦法改變,那么怎么改變呢?
const int i = 10; int *pi = &i; *pi = 20;上面是利用了指針的方式改變了i的地址空間里的內容,從而使i的值發生了改變。說到指針,想起了一個const位置不同而修飾對象不同的問題,看看下面這段代碼,const都分別修飾什么:
const int *p; int const *p; int *const p; const int *const p;是不是心里已經一萬個那什么在奔跑了,別著急,其實很簡單的,先忽略類型名(編譯器解析的時候也是忽略類型名),我們看 const 離哪個近。“近水樓臺先得月”,離誰近就修飾誰。
const *p; //const 修飾*p,p 是指針, *p 是指針指向的對象,不可變 const *p; //const 修飾*p,p 是指針, *p 是指針指向的對象,不可變 *const p; //const 修飾 p, p 不可變, p 指向的對象可變 const *const p; //前一個 const 修飾*p,后一個 const 修飾 p,指針 p 和 p 指向的對象 都不可變b. 修飾函數參數
修飾函數參數或返回值,這兒的作用與修飾變量幾乎一致,都是不允許被修飾的對象的值發生變化。
因為許多的函數,都不希望在函數內部的操作使函數參數的值發生變化,那么我們就可以用const來修飾這些參數,這里用一個庫函數strcmp來說明:
2、const用于CPP –> 編譯時常量
a. 繼承與C
C++里面的const幾乎有C語言的const的全部作用,但有一點區別就是,C語言里的const修飾的變量還是一個變量,盡管它具有常屬性,但是C++里的const修飾的變量,就徹底“淪為”了一個常量,這兒其實它的作用與#define很像,因此在上面會發生錯誤的一個例子,在這兒卻能不會出錯:
const int a = 10; int arr[a] = { 0 };這兒它是正確的,其實它就等價于:
#define a 10 int arr[a] = { 0 };當然,#define后面最好跟大寫字母,這兒為了與上面的例子統一,就用了小寫。
這兒也印證了C語言中的const是運行時常量,C++的const是編譯時常量的說法。
b. const修飾類成員
const類成員在對象構造期間允許被初始化并且在以后不允許被改變。const類成員和一般的const 變量有所不同。const類成員是對應于每個對象而言,它在對象構造期間被初始化,在這個對象的生存周期中不允許被改變。
c. const修飾成員函數
const 成員函數不允許在此函數體內對此函數對應的類的所有成員變量進行修改,這樣可以提高程序的健壯性。const一般放在函數體后:
functionType fun() const。
3、const在C和C++中最大的不同是,在C中,const默認具有外部鏈接,而C++中則是內部鏈接。所以當你只在定義const常量的文件中使用該常量時,c++不給你的const常量分配空間,此時const int c = 0;相當于#define c 0;而在C中,它會給每個const 常量分配內存空間。
總結
以上是生活随笔為你收集整理的const在C与C++中的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: axios传数组到后台_我是如何让公司后
- 下一篇: html中表格与字对齐,html – 中