1. 程式人生 > >C++ 之const的使用

C++ 之const的使用

過多 依然 設計 以及 改變 我們 成員函數 pil 類對象

在類中,有時候為了避免誤操作而修改了一些人們不希望被修改的數據,此時就必須借助const關鍵字加以限定了。借助const關鍵字可以定義const類型的成員變量、成員函數、常對象以及對象的常引用。

const成員變量

const成員變量其用法和普通的const變量用法相似,在定義時只需在前面加上const關鍵字即可。const成員變量的初始化只有唯一的一條途徑:參數初始化表。這個在前面已經提到過,不記得的話可以再去翻看參數初始化表那一小節。

const成員函數

const成員函數可以使用類中的所有成員變量,但是不能修改變量的值,這種措施主要還是為了保護數據而設置的。

我們來看一下下面的例子,例1依然是前面見過多次的book類,不過已經將與const成員函數不相關的代碼都去掉了。在類中定義了兩個構造函數及四個普通的成員函數,其功能分別是設置成員變量和獲得成員變量。但這個book類與前面不相同的是在getprice函數和gettitle函數聲明後面多了const關鍵字,這就是const成員函數,也可以成為常成員函數。常成員函數就是在聲明和定義的時候在函數頭部的結尾加上const關鍵字。註意在定義函數的時候const關鍵字依然是不能少的,具體可以參見例1中getprice和gettitle函數的定義。

為什麽要將這兩個函數定義成常成員函數呢?這兩個函數的功能我們知道就是為了返回price和title的,功能單一,並且不希望修改這兩個變量的,如此,定義成常成員函數是非常保險的一種做法,可以避免在這兩個函數內部修改成員變量。如果需要修改這兩個變量則只需通過setprice和settitle函數完成,因此設置為const是非常合適的。

    class book
    {
    public:
        book(){}
        book(char* a, double p = 5.0);
            void setprice(double a);
            void settitle(char* a);
        double getprice()const;   
        char * gettitle()const;
    private:
        double price;
        char * title;
    };
    double
book::getprice()const { return price; } char * book::gettitle()const { return title; }

常成員函數可以訪問類中的任何成員變量,但是不能修改任何成員變量。而普通的成員函數不能訪問常對象的成員變量,其它的成員變量都可以訪問,普通的成員函數可以修改的成員變量也只有非const成員變量了,一旦加上了const關鍵字加以修飾,初始化完成後就不能被修改了。還有一點需要註意的是const成員函數是不能調用類中非const成員函數的。

const對象

const對象定義的基本語法如下:
const 類名 對象名(實參名);
類名 const 對象名(實參名);
這兩種定義方式都是可以的,我們一旦將對象定義為常對象之後,該對象就只能調用類中的常成員函數了。

#include<iostream>
using namespace std;

class book
{
public:
    book(){}
    book(book &b);
    book(char* a, double p = 5.0);
    void setprice(double a);
    double getprice()const;
    void settitle(char* a);
    char * gettitle()const;
    void display()const;
private:
    double price;
    char * title;
};

book::book(book &b)
{
    price = b.price;
    title = b.title;
}

book::book(char* a, double p)
{
    title = a;
    price = p;
}

void book::display()const
{
    cout<<"The price of "<<title<<" is $"<<price<<endl;
}

void book::setprice(double a)
{
    price = a;
}

double book::getprice()const
{
    return price;
}

void book::settitle(char* a)
{
    title = a;
}

char * book::gettitle()const
{
    return title;
}


int main()
{
    const book Alice("Alice in Wonderland",29.9);
    Alice.display();
//    Alice.setprice(51.0);//compile error
    return 0;
}

在本例中,我們將類中的getprice、gettitle和display三個函數都聲明為了常成員函數,之後在主函數中我們定義了一個常對象Alice,Alice作為一個常對象,只能調用常成員函數,因此在調用display函數時沒有問題,但是在調用setprice函數時編譯報錯,因為setprice不是常成員函數。

有些時候我們在程序設計過程中要求修改常對象中的某個成員變量,這個時候如果是普通的成員變量是不能被修改的。為了滿足這一需求,C++提供了mutable關鍵字。

    mutable int var;

通過這樣的聲明將變量var聲明為可變的成員變量,此時如果要修改常對象的該變量時,只需要通過常對象調用const成員函數修改該變量即可。

對象的const引用

在將對象作為函數參數的時候,通常我們會采用引用的方式作為函數參數。有時候為了在函數中避免對對象本身做出什麽修改,在函數形參前加上const關鍵字。

#include<iostream>
using namespace std;

class book
{
public:
    book(){}
    book(book &b);
    book(char* a, double p = 5.0);
    void setprice(double a);
    double getprice()const;
    void settitle(char* a);
    char * gettitle()const;
private:
    double price;
    char * title;
};

book::book(book &b)
{
    price = b.price;
    title = b.title;
}

book::book(char* a, double p) 
{
    title = a;
    price = p;
}

void book::setprice(double a)
{
    price = a;
}

double book::getprice()const
{
    return price;
}

void book::settitle(char* a)
{
    title = a;
}

char * book::gettitle()const
{
    return title;
}

void display(const book &b)
{
        b.setprice(59.9);  //compile error
    cout<<"The price of "<<b.gettitle()<<" is $"<<b.getprice()<<endl;  //ok
}

int main()
{
    book Alice("Alice in Wonderland",29.9);
    display(Alice);
    book Harry("Harry potter", 49.9);
    display(Harry);
    return 0;
}

在本例中,我們將display函數聲明為頂層函數,其函數形參為book類對象的常引用,在函數內部我們首先調用public屬性的setprice函數,企圖修改price成員變量,編譯無法通過。而在其後調用gettitle和getprice函數則沒有問題,因為這些函數沒有修改成員變量。

C++ 之const的使用