c和c 中const用法具體的區別是什麼

2022-05-22 08:30:23 字數 5052 閱讀 5410

1樓:影子

c中的const,功能比較單一,較容易理解:

作用:被修飾的內容不可更改。

使用場合: 修飾變數,函式引數,返回值等。(c++中應用場合要豐富的多)

特點: 是執行時const,因此不能取代#define用於成為陣列長度等需要編譯時常量的情況。同時因為是執行時const,可以只定義而不初始化,而在執行時初始化。

如 const int iconst;。 另外,在c中,const變數預設是外部連結,因此在不同的編譯單元中如果有同名const變數,會引發命名衝突,編譯時報錯。

c++中的const:跟c中比較,內容要豐富很多,當然,作用也更大了

1:非類成員const

*在c++中,const變數(在這裡涉及的const都不是類中的const,類中的const專門提出來記錄)預設是內部連線的,因此在不同的編譯單元中可以有同名的const 變數定義。

*是編譯時常量,因此可以像#define一樣使用,而且因為上面一點,可以在標頭檔案中定義const變數,包含的不同的cpp檔案(編譯單元)中使用而不引起命名衝突。

*編譯器預設不為const變數分配記憶體,除非:1. 使用 extern 申明, 2:程式中有引用const 變數的地址。

* 可以使用下面的型別轉換(不安全的): 1: int * = (int *)pconst 2: int * = const_castpconst(c++解const屬性cast)

* 函式引數或者返回值能使用 const & or const * 時,儘量使用const屬性,增強程式健全性。

*c++中臨時物件/內建變數預設具有const屬性

2:類中的const

*類中的const與c語言中的const一樣,只是執行時常量,不能作為陣列維數使用,即不能取代#define。在類中使用下面兩種方式取代#define: 1:

static const... 2: enum//enum 不佔儲存空間

*類中的const 變數佔用儲存空間

*類中的const成員變數需要在建構函式初始化列表中初始化

*const 物件:在該物件生命週期內,必須保證沒有任何成員變數被改變。const物件只能呼叫const成員函式。

*const成員函式: void fun() const ... 不僅能被const物件呼叫,也能被非const物件呼叫,因此,如果確認一個任何成員函式不改變任何成員變數,應該習慣性將該函式定義成const型別。

如果const成員函式需要改變成員變數,有兩種實現方式: 1 ,const_castthis強制取消this指標的const屬性。 2:

將被改變的成員變數定義成mutable:mutable int i; //應永遠只使用第二種方法,讓任何閱讀程式的人都知道該變數可能被const函式改變。

*如果一個物件被定義成const,那麼該const物件「可能」會被放入到rom當中,這在嵌入式開發當中有時非常重要。。。。(不能有任何自定義的constructor 和destructor。它的基類或者成員物件不能有自定義的constructor和destructor,不能有任何mutable成員變數)

2樓:匿名使用者

const基本用法是一樣的,就是表達 「一個不可改變」的意思

只是c++中增加了在類成員函式定義尾 增加const使用,表達本函式中無任何對成員變數的修改操作控制。如: int get_data () const

c和c++中const的區別是什麼?請說具體點

3樓:匿名使用者

c中的const,功能比較單一,較容易理解:

作用:被修飾的內容不可更改。

使用場合: 修飾變數,函式引數,返回值等。(c++中應用場合要豐富的多)

特點: 是執行時const,因此不能取代#define用於成為陣列長度等需要編譯時常量的情況。同時因為是執行時const,可以只定義而不初始化,而在執行時初始化。

如 const int iconst;。 另外,在c中,const變數預設是外部連結,因此在不同的編譯單元中如果有同名const變數,會引發命名衝突,編譯時報錯。

c++中的const:跟c中比較,內容要豐富很多,當然,作用也更大了

1:非類成員const

*在c++中,const變數(在這裡涉及的const都不是類中的const,類中的const專門提出來記錄)預設是內部連線的,因此在不同的編譯單元中可以有同名的const 變數定義。

*是編譯時常量,因此可以像#define一樣使用,而且因為上面一點,可以在標頭檔案中定義const變數,包含的不同的cpp檔案(編譯單元)中使用而不引起命名衝突。

*編譯器預設不為const變數分配記憶體,除非:1. 使用 extern 申明, 2:程式中有引用const 變數的地址。

* 可以使用下面的型別轉換(不安全的): 1: int * = (int *)pconst 2: int * = const_castpconst(c++解const屬性cast)

* 函式引數或者返回值能使用 const & or const * 時,儘量使用const屬性,增強程式健全性。

*c++中臨時物件/內建變數預設具有const屬性

2:類中的const

*類中的const與c語言中的const一樣,只是執行時常量,不能作為陣列維數使用,即不能取代#define。在類中使用下面兩種方式取代#define: 1:

static const... 2: enum//enum 不佔儲存空間

*類中的const 變數佔用儲存空間

*類中的const成員變數需要在建構函式初始化列表中初始化

*const 物件:在該物件生命週期內,必須保證沒有任何成員變數被改變。const物件只能呼叫const成員函式。

*const成員函式: void fun() const ... 不僅能被const物件呼叫,也能被非const物件呼叫,因此,如果確認一個任何成員函式不改變任何成員變數,應該習慣性將該函式定義成const型別。

如果const成員函式需要改變成員變數,有兩種實現方式: 1 ,const_castthis強制取消this指標的const屬性。 2:

將被改變的成員變數定義成mutable:mutable int i; //應永遠只使用第二種方法,讓任何閱讀程式的人都知道該變數可能被const函式改變。

*如果一個物件被定義成const,那麼該const物件「可能」會被放入到rom當中,這在嵌入式開發當中有時非常重要。。。。(不能有任何自定義的constructor 和destructor。它的基類或者成員物件不能有自定義的constructor和destructor,不能有任何mutable成員變數)

c++中的const的用法

4樓:傅夏生

個人的一些筆記,希望可以幫助你

const 的使用

const經常用來修飾一個值不能改變的量,安全,並且能消除儲存操作

const的幾種用法:

(1) 說明值常量

(2) 說明指標

(3) 說明函式引數及其返回值

(4) 說明類的常量和成員函式

const 說明值常量

值常量的說明一般放在標頭檔案或者檔案的開始部分,也可以放在類中進行說明

(1) 說明符號常量,表明符號代表的是一個常量,語法:

《型別》const《常量名》=《表示式》,《常量名》=《表示式》……

例如:double const pi=3.14; const double pi=3.14;

(2) 說明陣列常量,語法格式:

《型別》const《陣列名》[大小]=;

const型別》 《陣列名》[大小]=;

(3) 說明物件常量,語法格式:

《類名》const《物件名》;

const 《類名》 《物件名》;

(4) 說明引用常量

(5) const與c語言中的#define的差別

無參巨集不是符號常量,沒有資料型別,沒有值,在記憶體中不分配地址。它在預處理時做巨集替換,不可能做型別檢查。

const定義的常量是符號常量,有資料型別,也有值,且其值不可改變,在記憶體中有地址,編譯時做型別檢查。

const和指標

const和指標的三種經典組合

(1) 指向常量的指標——const int *p;

(2) 常指標——char *const pc=』a』;

(3) 指向常量的常指標——const char *const pc=』a』

指向常量的指標(指標指向一個不可變數)

指標在指向有一個常量後,不能通過指標修改這個常量,但是可以指向一個新的常量,例如:

const char *pc=」abcd」;

pc[3]=』a』;不合法,企圖修改原來指向的常量

pc=「wert」;合法指向另外一個常量

常指標要把指標變數中的值(也就是地址)宣告為常量,採用以下語法:

《類那些》*const《指標名》[=《初值》;]

這樣定義的指標變數中存放的指標是個常量,稱為常指標。定義後,該指標指向固定的記憶體單元,不能再指向其他記憶體單元,通過它可以修改所指單元裡存放的內容。例如:

char *const pc=」abcd」;

pc[3]=』a』;合法,指標指向的物件可以修改

pc=」qwer」;不可以,指標的指向不可以修改

指向常量的常指標

指標變數中存放的指標本身和指標所指向的物件都是不可以改變的。

例如:const char *const pc=」asdf」;

pc[3]=』a』;不合法,不能改變指標所指物件的值

pc=」qwer」;不合法,不能改變指標的指向

const說明函式引數和返回值

用const限定函式引數和返回值,是const最重要的用法。用const修飾函式引數意味著傳過來的實參在函式中是不能被修改的。一般情況下不需要,但是在用指標和引用傳值的場合,為避免實參被修改,就用const修飾,更安全。

修飾函式的返回值,意味著該返回值不能被修改。如果傳值並返回地址,const將保證該地址上的內容不會被改變。這就意味著該函式不能作為左值使用,在這種情況下,const通常也是與引用和指標一起使用的。

類中的const

1. 常成員的函式

2. 常資料成員

3. 常物件

C中的const形參,C const的用法

只有c 才會有這個疑問,我也是 int add const int aa 其實不用ref const,比如string,你就直接ref string就可以了,而定義這個string的時候,前面加上const就ok了。我想這就是樓主想要的效果吧。汗,你不用關鍵字ref直接傳遞一個值型別變數進去 就只是...

C或C中define和const的區別

define 就是一個巨集替換過程,不用開闢記憶體空間 const 定義了變數 要佔記憶體空間 1 編譯器處理方式不同 define巨集是在預處理階段。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是。const常量有具體的型別,在編譯階段...

c中的const何readonly關鍵字含義和作用有什麼區

常數表示式是在編譯時可被完全計算的表示式。因此不能從一個變數中提取的值來初始化常量。如果const int a b 1 b是一個變數,顯然不能再編譯時就計算出結果,所以常量是不可以用變數來初始化的。readonly 允許把一個欄位設定成常量,但可以執行一些運算,可以確定它的初始值。因為readonl...