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 開闢一個存放整數的儲存空間,返回一個指向該儲存空間的地址 即...