1. 程式人生 > >const關鍵字的使用

const關鍵字的使用

函數的參數 限制 復制 include mutable tab 進行 返回 接受

定義const變量

通常使用const來定義常量,在變量的前面加上const關鍵字即可如下:

const int a;
int const a;    //表示a的值是一個常量,不可以通過賦值的方式來修改

在C++中const被當成編譯期的常量來處理,也就是說,編譯器不為const常量分配空間,只在編譯時將它的值保存在名字列表中,當我們通過內存地址間接修改常量的值時,其結果保持不變。代碼如下:

#include<stdio.h>
int main()
{
    const int a=1;
    int *p=(int*)&a;
    *p=100;
    printf(
"a=%d\n",a); return 0; }

其運行結果如下:a=1;

在類與對象中的應用:

在C++中const在類與對象中的應用主要有以下幾個場合:

(1):常量數據成員的應用

(2):函數的參數為常量的應用

(3):常量函數的應用

(4):常量對象的應用

常量數據成員的應用

若類中的某個數據成員是常量,表示這個數據成員不能直接被修改,故const數據成員要求初始化,在類中數據成員是不允許在定義時初始化的,類僅僅是一種數據類型,類中的數據成員和成員函數的使用都是通過實例的對象調用,也就是說,有了對象類中的數據成員和函數成員才有了生命,因此const數據成員的初始化應該在對象產生的時刻,即應該在構造函數中初始化,並且const數據成員是在構造函數的初始化表中進行的。程序如下:

class A
{
private:
    int a;
    const int b;                            //const常量
public:
    A(int a, int b):a(a),b(b){}            //const數據成員初始化
    void show()
    {
        cout<<a<<","<<b<<endl;
    }
};
註:const數據成員是必須在構造函數的初始化表中進行!!!!

函數參數為常量的應用方法

類中的函數成員的參數通常使用引用,表示用源頭的數據,不會再自己復制一份。當希望傳遞給函數成員的數據不被破壞,就需要定義成const變量

#include<iostream>
using namespace std;
class A
{
private:
    int a;
    const int b;
public:
    A(int a, int b):a(a),b(b){}
    void show()
    {
        cout<<"a="<<a<<","<<"b="<<b<<endl;
    }
    void set(const int &x)                  //通過引用直接訪問x,並且保證x的值不會被篡改
    {
        a=x;
    }
};

int main()
{
    int x=99;
    A a(1,2);
    a.show();
    a.set(x);
    a.show();
    return 0;
}

運行結果:

a=1,b=2
a=99,b=2

常量成員函數與常量對象的使用方法

在C++中,常量函數必須定義在類中,以成員函數的形式出現,常量成員函數的好處就是保證類的封裝性,能夠有效的防止類的數據成員被非法訪問。

常量函數的定義:

int fun(void) const; 

註意:const int fun(void);表示的是該函數的返回值為常量,不可與常量函數混淆!!

上面的常量函數 int fun(void) const 實際上與int fun(void)構成重載關系,重載函數是通過函數的參數或個數不同來構成重載的,int fun(void) const 與int fun(void)構成重載關系是因為this指針,普通函數的this指針是普通指針,而const成員函數是常量指針。

對象調用常量函數規則有以下幾個(歸根到底就是this指針是常量指針):

1、非常量對象可以調用常量函數

2、非常量對象可以調用非常量函數

3、常量對象可以調用常量函數

4、常量對象不可以調用非常量函數

5、常量函數和非常量函數重載時,非常量對象調用非常量函數

6、常量函數和非常量函數重載時,常量對象調用常量函數

總結:歸根到底常量函數還是屬於對象的(和static要區分開),故可以被任何對象調用;

常量對象由於this指針是常量指針,故不可以調用非常量函數(常量函數可以接受非常量,但不可以把常量賦給非常量);

突破常量成員函數修改數據成員的限制

將this常量指針轉換為非常量指針

將this常量指針的const屬性去掉,可以使用const_cast(去const)運算符完成

將數據成員定義為mutable屬性

將數據成員定義為:mutable int a;就可以間接實現常量函數修改成員數據。

const關鍵字的使用