C 中的const的用法,c 中const是怎麼使用的?

2021-09-03 07:05:00 字數 6409 閱讀 9209

1樓:傅夏生

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

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. 常物件

2樓:惠智傑

我來說一下,具體原因應該是這個,常變數在定義的時候必須初始化,所以當你在a.cpp中定義extern const double pi=3.14; b.

pp中extern const double pi;可以通過編譯執行。因為當編譯系統發現a.cpp中的全域性常變數時,就知道它pi是常量,而換過來的時候,在a.

cpp中定義const double pi=3.14; b.pp中extern const double pi;編譯系統在編譯a.

cpp是沒有問題的,但到了b.cpp中就會發現,有一個外部常量是沒有初始化的,而常量是不能在宣告後再進行定義的,所以編譯系統會認為找不到它的定義,所以就出錯。

對於extern "c"主要是因為c和c++編譯器不同,它們對相同的函式名編譯後生成的相同的標示不同,故而在引用c的庫檔案時必須使用extern “c”告訴編譯器,它是c的函式,按c的規則編譯。通常我們使用的標準標頭檔案已被處理過。 貌似沒有用於常量的宣告。

3樓:97樂於助人

返回const,則呼叫時也必須宣告為const,防止返回的指標內容被修改。

4樓:匿名使用者

1,希望成員函式不改變成員的時候:比如:int a::print const {}

2,不希望指標去改變指向的記憶體空間:比如: const int* p;

3,不希望指標的指向被改變:比如: int *const p;

4,還有就是引用。。

5樓:秒懂百科

const:一個c語言的關鍵字

6樓:匿名使用者

如果const用於定義一個非指標的普通變數,就是定義了一個常變數,這個變數以後的值在生命期內是不能改變的,因此也必須對該變數進行初始化,在c++中要在類的初始化列表中初始化。

如果const用於定義一個指標變數,不同的寫法有不同的意思。例如const char *p和char* const p 前者表示p指向的內容是不能夠改變的,後者是指p本身的值是不能夠改變的。

如果用於修飾函式返回值,效果和修飾變數一樣。

const修飾類的成員函式,則該成員函式不能修改類中任何非const成員函式。一般寫在函式的最後來修飾。

const修飾類物件表示該物件為常量物件,在物件的生命期中其中的任何成員都不能被修改。

關於const用法還是比較複雜的,還有很多用法,我也沒有總結詳盡,以後遇到可以自己寫程式測試。

c++中const是怎麼使用的?

7樓:

用來修飾變數或函式(包括成員函式)及其引數:

(1)const修飾基本資料型別

(2)const應用到函式中

(3)const在類中的用法

(4)const修飾類物件,定義常量物件

一、const修飾基本資料型別

1.const修飾一般常量及陣列

const int a=10; 等價的書寫方式: int const a=10;

const int arr[3]=; int const arr[3]=;

對於類似這些基本資料型別,修飾符const可以用在型別說明符前,也可以用在型別說明符後,其結果是一樣的。在使用這些常量的時候,只要不改變這些常量的值便好。

2.const修飾指標變數*及引用變數&

介紹本部分內容之前,先說說指標和引用的一些基本知識。

指標(pointer)是用來指向實際記憶體地址的變數,一般來說,指標是整型,而且一般的大家會接受十六進位制的輸出格式。

引用(reference)是其相應變數的別名,用於向函式提供直接訪問引數(而不是引數的副本)的途徑,與指標相比,引用是一種受限制的指標型別,或者說是指標的一個子集,而從其功能上來看,似乎可以說引用是指標功能的一種高層實現。

關於運算子&和*:

在c++裡,沿襲c中的語法,有兩個一元運算子用於指標操作:&和*。按照本來的定義,&應當是取址符,*是指標符,也就是說, &用於返回變數的實際地址,*用於返回地址所指向的變數,他們應當互為逆運算。

實際的情況也是如此。

在定義變數的引用的時候,&只是個定義引用的標誌,不代表取地址。

***************************const修飾指標(*):*********************

const int* a = & [1] //非常量資料的常量指標 指標常量

int const *a = & [2] //非常量資料的常量指標 a is a pointer to the constant char variable

int* const a = & [3] //常量資料的非常量指標指標常量 常量指標 a is a constant pointer to the (non-constant) char variable

const int* const a = & [4] //常量資料的常量指標

可以參考《effective c++》item21上的做法,

如果const位於星號*的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;

如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。

因此,[1]和[2]的情況相同,都是指標所指向的內容為常量,這種情況下不允許對內容進行更改操作,如不能*a = 3 ;

[3]為指標本身是常量,而指標所指向的內容不是常量,這種情況下不能對指標本身進行更改操作,如a++是錯誤的;

[4]為指標本身和指向的內容均為常量。

****************const修飾引用(&):***************************

int const &a=x;

const int &a=x;

int &const a=x;//這種方式定義是c、c++編譯器未定義,雖然不會報錯,但是該句效果和int &a一樣。

這兩種定義方式是等價的,此時的引用a不能被更新。如:a++ 這是錯誤的。

二、const應用到函式中

1.作為引數的const修飾符

2.作為函式返回值的const修飾符

其實,不論是引數還是返回值,道理都是一樣的,引數傳入時候和函式返回的時候,初始化const變數

1 修飾引數的const,如 void fun0(const a* a ); void fun1(const a& a);

呼叫函式的時候,用相應的變數初始化const常量,則在函式體中,按照const所修飾的部分進行常量化,如形參為const a* a,

則不能對傳遞進來的指標的內容 進行改變,保護了原指標所指向的內容;如形參為const a& a,則不能對傳遞進來的引用物件進行改變,

保護了原物件的屬性。

[注意]:引數const通常用於引數為指標或引用的情況;

2 修飾返回值的const,如const a fun2( ); const a* fun3( );

這樣宣告瞭返回值後,const按照"修飾原則"進行修飾,起到相應的保護作用。

const rational operator*(const rational& lhs, const rational& rhs)

返回值用const修飾可以防止允許這樣的操作發生:

rational a,b;

radional c;

(a*b) = c;

一般用const修飾返回值為物件本身(非引用和指標)的情況多用於二目操作符過載函式併產生新物件的時候。

類中的成員函式:a fun4()const; 其意義上是不能修改所在類的的任何變數。

三、類中定義常量(const的特殊用法)

在類中實現常量的定義大致有這麼幾種方式實現:

1.使用列舉型別

class test

; // 列舉常量

int array1[size1];

int array2[size2];

};2.使用const

不能在類宣告中初始化const資料成員。以下用法是錯誤的,因為類的物件未被建立時,編譯器不知道size的值是什麼。

class test

;正確的使用const實現方法為:const資料成員的初始化只能在類建構函式的初始化表中進行。

注意:對const成員變數的初始化,不能在變數宣告的地方,必須在類的建構函式的初始化列表中完成,即使是在建構函式內部賦值也是不行的。

具體原因請參見 【初始化列表和賦值的區別】

3.使用static const

通過結合靜態變數來實現:

#include

class year

};int const year::inity=1997;//靜態變數的賦值方法,注意必須放在類外定義

void main()

{cout<要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;

<2> 要避免最一般的賦值操作錯誤,如將const變數賦值,具體可見思考題;

<3> 在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;

<4> const在成員函式中的三種用法(引數、返回值、函式)要很好的使用;

<5>不要輕易的將函式的返回值型別定為const;

<6>除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;

c 中const的作用是什麼,c 中const的作用

const 一個c語言的關鍵字 限定修改 比如const int i 2 那麼在後面i的值是不能修改的,另外const限定定義變數以後必須賦初值 又比如const的引用 const int i 2 const a i a為i的一個引用,也是不能修改的,這一點在函式引數傳遞的時候用的比較多 另外還有個...

c 中的用法,C 操作符 用法

在c 裡,除了c語言的功能之外,還代表 引用 只能在建立變數的時候使用,格式是 型別 變數名 另一個變數。如 inta 0,b a,c 宣告三個變數a b c,b和a等價,c是獨立的變數注意 型別識別符號是指目標變數 等於號右邊 的型別。宣告引用時,必須同時對其進行初始化,不能讓他指向其他變數。引用...

c語言中const是什麼意思,C語言中const是什麼意思。。。

const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。const關鍵字使用非常的靈活,這一點和php差別很大,php中const用來在類中定義一個常量,而在c中,const因位置不同有不同的作用,因情景不同有不同的角色,使用起來也是非常的靈活。一 const用來修飾普通...