C++ 之const的使用
在類中,有時候為了避免誤操作而修改了一些人們不希望被修改的數據,此時就必須借助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; }; doublebook::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的使用