1. 程式人生 > >C++ const關鍵詞用法

C++ const關鍵詞用法

volatile ati 意義 屬性。 private 不可 一個 編譯器 後者

【轉載】轉自 https://www.cnblogs.com/chogen/p/4574118.html

const是一個C++語言的限定符,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。

1. 修飾常量

用const修飾的變量是不可變的,以下兩種定義形式在本質上是一樣的:

const int a = 10;
int const a = 10;

2. 修飾指針

如果const位於*的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;
如果const位於*的右側,const就是修飾指針本身,即指針本身是常量。
因此,推薦使用int const* p,而不是使用const int* p(雖然兩者意義完全一樣),這樣更容易理解。

int a = 10;
const int* p = &a;            // 指針指向的內容不能變
int const* p = &a;            // 同上
int* const p = &a;            // 指針本身不能變
const int* const p = &a;      // 兩者都不能變
int const* const p = &a;      // 同上

3. 修飾引用

以下兩種定義形式在本質上是一樣的:

int a = 10;
const int& b = a;
int const& b = a;

4. 修飾函數參數

用const修飾函數參數,傳遞過來的參數在函數內不可以改變。

void func (const int& n)
{
     n = 10;        // 編譯錯誤 
}

5. 修飾函數返回值

用const修飾函數返回值的含義和用const修飾普通變量以及指針的含義基本相同。

const int* func()   // 返回的指針所指向的內容不能修改
{
    // return p;
}

6. 修飾類成員變量

用const修飾的類成員變量,只能在類的構造函數初始化列表中賦值,不能在類構造函數體內賦值。

class A
{
public:
    A(int x) : a(x)  // 正確
    {
         //a = x;    // 錯誤
    }
private: const int a; };

7. 修飾類成員函數

用const修飾的類成員函數,在該函數體內不能改變該類對象的任何成員變量, 也不能調用類中任何非const成員函數。

class A
{
public:
    int& getValue() const
    {
        // a = 10;    // 錯誤
        return a;
    }

private:
    int a;            // 非const成員變量
};

8. 修飾類對象

用const修飾的類對象,該對象內的任何成員變量都不能被修改。
因此不能調用該對象的任何非const成員函數,因為對非const成員函數的調用會有修改成員變量的企圖。

class A
{
 public:
    void funcA() {}
    void funcB() const {}
};

int main
{
    const A a;
    a.funcB();    // 可以
    a.funcA();    // 錯誤

    const A* b = new A();
    b->funcB();    // 可以
    b->funcA();    // 錯誤
}

9. 在類內重載成員函數

class A
{
public:
    void func() {}
    void func() const {}   // 重載
};

10. const與宏定義的區別

const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換時可能會產生意料不到的錯誤。
const常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若幹個拷貝。
另外,編譯器通常不為const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

#define PI 3.1415926535
const double PI = 3.1415926535;

11. const_cast

const_cast運算符用來修改類型的const或volatile屬性。
一、常量指針被轉化成非常量的指針,並且仍然指向原來的對象;
二、常量引用被轉換成非常量的引用,並且仍然指向原來的對象。

void func()
{
    const int a = 10;
    int* p = const_cast<int*> (&a);
    *p = 20;
    std::cout<<*p;    // 20
    std::cout<<a;     // 10, 原因見第10部分
}

C++ const關鍵詞用法