1. 程式人生 > >類中的屬性和方法被const修飾

類中的屬性和方法被const修飾

在C語言和C++中有一個很特殊的關鍵詞——const,這個關鍵詞表示常量的意思,一旦被該關鍵詞修飾後,則該變數變成了一個常量,const可以修飾變數,也可以修飾指標,也可以修飾引用,同樣地,const也可以用來修飾類或結構體中的屬性或方法。const的好處之一就是防止後續程式中修改不允許變動的值,以避免產生bug。如下面的程式,就是一個典型的方法可以改變物件中的屬性:

#include <iostream>
using namespace std;

struct A{
    int m, n;
    void f(){    //呼叫這個方法將改變這個類的屬性
        m++;
        n++;
    }
};

int
main(){ A a1 = {1, 2}; A a2 = {5, 6}; a1.f(); //改變物件a1的屬性 a2.f(); //改變物件a2的屬性

在這種情況下,物件的屬性很容易被改變,如果這時我不想某一物件中的屬性時,這時可用const修飾該物件,如:

#include <iostream>
using namespace std;

struct A{
    int m, n;
    void f(){  //同樣地,該方法修改了類中的屬性
        m++;
        n++;
    }
};

int main(){
    const
A a1 = {5, 6}; //用const修飾物件a1,說明a1是個常量物件,屬性不允許被修改 A a2 = {5, 6}; //非常量物件 a1.f(); //產生編譯錯誤,a1為常量物件,其屬性不允許被修改 a2.f(); //合法 }

值得注意的是,被const修飾的物件不能呼叫類中沒有被const修飾的方法,例如上面的物件a1不能呼叫方法f,但可以呼叫被const修飾的方法。但是沒有被const修飾的物件是可以呼叫被const修飾的方法的,例如下面的程式:

#include <iostream>
using namespace std;

struct
A{ int m, n; void f() const { //該函式被const修飾 cout << m << "\t" << n << endl; } }; int main(){ const A a1 = {3, 4}; //被const修飾的物件a1 A a2 = {5, 6}; //未被const修飾的物件a2 a1.f(); //合法,因為方法f也被const修飾 a2.f(); //合法,雖然a2未被const修飾,但也可以呼叫被const修飾的方法 }

輸出結果:

一旦類中的方法被const修飾了,則意味著該方法為常量,方法中不得有修改類中屬性的語句存在,例如:

struct A{
    int m, n;
    void f() const {
        m++;  //產生編譯錯誤,此處修改了類中的屬性
        int d = 0;
        d++; //合法,d不是類中的屬性,可以被修改
    }
};

同樣地,被const修飾的方法也不允許呼叫其他能夠修改類中屬性的其他方法,例如:

struct A{
    int m, n;
    void h(){
        m++;
        n++;
    }
void f() const {
    h();  //產生編譯錯誤,方法h修改了類中的屬性,方法f被const修飾,不得呼叫方法h
}

一般地,在一些類的方法中,如果需要將屬性作為返回值的,或者需要以文字形式輸出的方法都會用const修飾,如下面的程式:

#include <iostream>
using namespace std;

class Complex{
    int re;
    int im;
public:
    void setCom(int r, int i){
        re = r;
        im = i;
    }

    int getReal() const {  //該函式用const修飾,因為僅僅是以實部作為返回值
        return re;
    }

    int getImag() const { //同樣地用const修飾
        return im;
    }

    void text() const {  //以文字形式輸出,也用const修飾
        cout << "this complex number is : << re << " + " << im << "j" <<endl;
    }
};

int main(){
    Complex com1;
    com1.setCom(5, 6);
    cout << com1.getReal() << endl;
    cout << com1.getImag() << endl;
    com1.text();
}

輸出結果:

如有錯誤,歡迎大家批評與指正!