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

時間 2021-09-03 07:05:17

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 中的用法,C 中new的用法

除了樓上說的 還有 引用 和 取地址 的含義int a int b a 上述兩行語句執行完之後,a b表示同一個變數,對其中一個的操作相當於對另一個的操作 int a int b a 則b中儲存的是a的地址。對 b 的任何操作相當於對a的操作。 朱古力兜 表示引用,就是物件的另一個名字,例如 int...

關於c 中const問題

include using namespace std void printvalues const int beg,const int end while beg end cout beg printvalues j,j 2 return 0 自己多多測試就會明白的。希望能看懂o o const ...

c 中NEW運算子的用法,C 中new的用法

c 中new運算子使用的一般格式為new 型別 初值 用new分配陣列空間時不能指定初值。如果由於記憶體不足等原因而無法正常分配空間,則new會返回一個空指標null,使用者可以根據該指標的值判斷分配空間是否成功。 吾不笑 new int 開闢一個存放整數的儲存空間,返回一個指向該儲存空間的地址 即...