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是非常合適的。
常成員函數可以訪問類中的任何成員變量,但是不能修改任何成員變量。而普通的成員函數不能訪問常對象的成員變量,其它的成員變量都可以訪問,普通的成員函數可以修改的成員變量也只有非const成員變量了,一旦加上了const關鍵字加以修飾,初始化完成后就不能被修改了。還有一點需要注意的是const成員函數是不能調用類中非const成員函數的。
const對象
const對象定義的基本語法如下:
? ? const 類名 對象名(實參名);
? ? 類名 const 對象名(實參名);
這兩種定義方式都是可以的,我們一旦將對象定義為常對象之后,該對象就只能調用類中的常成員函數了。
在本例中,我們將類中的getprice、gettitle和display三個函數都聲明為了常成員函數,之后在主函數中我們定義了一個常對象Alice,Alice作為一個常對象,只能調用常成員函數,因此在調用display函數時沒有問題,但是在調用setprice函數時編譯報錯,因為setprice不是常成員函數。
有些時候我們在程序設計過程中要求修改常對象中的某個成員變量,這個時候如果是普通的成員變量是不能被修改的。為了滿足這一需求,C++提供了mutable關鍵字。
通過這樣的聲明將變量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 errorcout<<"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函數則沒有問題,因為這些函數沒有修改成員變量。
?
轉載于:https://www.cnblogs.com/wanghuixi/p/7008231.html
總結
以上是生活随笔為你收集整理的C++ 之const的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux文件管理常用命令
- 下一篇: springmvc拦截器配置