c++中const的使用詳解

來源:互聯網
上載者:User

Const 是C++中常用的類型修飾符,常類型是指使用類型修飾符const說明的類型,常類型的變數或對象的值是不能被更新的。

1、定義常量
(1)const修飾變數,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的類型為TYPE的變數value是不可變的。

TYPE const ValueName = value;
const TYPE ValueName = value;

(2)將const改為外部串連,作用於擴大至全域,編譯時間會分配記憶體,並且可以不進行初始化,僅僅作為聲明,編譯器認為在程式其他地方進行了定義.

extend const int ValueName = value;

2、指標使用CONST
(1)指標本身是常量不可變
(char*) const pContent;
const (char*) pContent;

(2)指標所指向的內容是常量不可變
const (char) *pContent;
(char) const *pContent;

(3)兩者都不可變
const char* const pContent;

(4)還有其中區別方法,沿著*號劃一條線:
如果const位於*的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;
如果const位於*的右側,const就是修飾指標本身,即指標本身是常量。

3、函數中使用CONST

(1)const修飾函數參數
a.傳遞過來的參數在函數內不可以改變(無意義,因為Var本身就是形參)

void function(const int Var);

b.參數指標所指內容為常量不可變

void function(const char* Var);

c.參數指標本身為常量不可變(也無意義,因為char* Var也是形參)

void function(char* const Var);

d.參數為引用,為了增加效率同時防止修改。修飾引用參數時:

void function(const Class& Var); //引用參數在函數內不可以改變

void function(const TYPE& Var); //引用參數在函數內為常量不可變

2)const 修飾函數傳回值
const修飾函數傳回值其實用的並不是很多,它的含義和const修飾普通變數以及指標的含義基本相同。
a.const int fun1() //這個其實無意義,因為參數返回本身就是賦值。
b. const int * fun2() //調用時 const int *pValue = fun2();
//我們可以把fun2()看作成一個變數,即指標內容不可變。
c.int* const fun3() //調用時 int * const pValue = fun2();
//我們可以把fun2()看作成一個變數,即指標本身不可變。

4、類相關CONST

(1)const修飾成員變數
const修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。
class A
{

const int nValue; //成員常量不能被修改

A(int x): nValue(x) { } ; //只能在初始化列表中賦值
}

(2)const修飾成員函數
const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。一般寫在函數的最後來修飾。
class A
{

void function()const; //常成員函數, 它不改變對象的成員變數.

//也不能調用類中任何非const成員函數。
}

(3)const修飾類對象/對象指標/對象引用

•const修飾類對象表示該對象為常量對象,其中的任何成員都不能被修改。對於對象指標和對象引用也是一樣。
•const修飾的對象,該對象的任何非const成員函數都不能被調用,因為任何非const成員函數會有修改成員變數的企圖。

例如:

複製代碼 代碼如下:class AAA
{
void func1();
  void func2() const;
}
const AAA aObj;
aObj.func1(); //×
aObj.func2(); //正確

const AAA* aObj = new AAA();
aObj-> func1(); //×
aObj-> func2(); //正確

5、將Const類型轉化為非Const類型的方法

C++提供了四個轉換運算子:

•const case <new type> (expression)
•static_cast <new_type> (expression)
•reinterpret_cast <new_type> (expression)
•dynamic_cast <new_type> (expression)

採用const_cast 進行非Const類型轉換。
用法:const_cast <type_id> (expression)
該運算子用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。

•常量指標被轉化成非常量指標,並且仍然指向原來的對象;
•常量引用被轉換成非常量引用,並且仍然指向原來的對象;
•常量對象被轉換成非常量對象。

複製代碼 代碼如下:const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 7;

當然我們可以用下面的傳統方式代替:複製代碼 代碼如下:const int constant = 21;
int* modifier = (int*)(&constant);

從前面代碼中已經看到,我們不能對constant進行修改,但是我們可以對modifier進行重新賦值。

但是但是,程式世界真的混亂了嗎?我們真的通過modifier修改了constatn的值了嗎?修改const變數的資料真的是C++去const的目的嗎?

如果我們把結果列印出來:

複製代碼 代碼如下:cout << "constant: "<< constant <<endl;
cout << "const_p: "<< *const_p <<endl;
cout << "modifier: "<< *modifier <<endl;
/**
constant: 21
const_p: 7
modifier: 7
**/

constant還是保留了它原來的值。

可是它們的確指向了同一個地址呀:

複製代碼 代碼如下:cout << "constant: "<< &constant <<endl;
cout << "const_p: "<< const_p <<endl;
cout << "modifier: "<< modifier <<endl;

/**
constant: 0x7fff5fbff72c
const_p: 0x7fff5fbff72c
modifier: 0x7fff5fbff72c
**/

雖然這樣可以重新賦值const的值,但是絕對不要對const資料進行重新賦值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.