C++ 之const的使用
在類中,有時(shí)候?yàn)榱吮苊庹`操作而修改了一些人們不希望被修改的數(shù)據(jù),此時(shí)就必須借助const關(guān)鍵字加以限定了。借助const關(guān)鍵字可以定義const類型的成員變量、成員函數(shù)、常對(duì)象以及對(duì)象的常引用。
const成員變量
const成員變量其用法和普通的const變量用法相似,在定義時(shí)只需在前面加上const關(guān)鍵字即可。const成員變量的初始化只有唯一的一條途徑:參數(shù)初始化表。這個(gè)在前面已經(jīng)提到過,不記得的話可以再去翻看參數(shù)初始化表那一小節(jié)。
const成員函數(shù)
const成員函數(shù)可以使用類中的所有成員變量,但是不能修改變量的值,這種措施主要還是為了保護(hù)數(shù)據(jù)而設(shè)置的。
我們來看一下下面的例子,例1依然是前面見過多次的book類,不過已經(jīng)將與const成員函數(shù)不相關(guān)的代碼都去掉了。在類中定義了兩個(gè)構(gòu)造函數(shù)及四個(gè)普通的成員函數(shù),其功能分別是設(shè)置成員變量和獲得成員變量。但這個(gè)book類與前面不相同的是在getprice函數(shù)和gettitle函數(shù)聲明后面多了const關(guān)鍵字,這就是const成員函數(shù),也可以成為常成員函數(shù)。常成員函數(shù)就是在聲明和定義的時(shí)候在函數(shù)頭部的結(jié)尾加上const關(guān)鍵字。注意在定義函數(shù)的時(shí)候const關(guān)鍵字依然是不能少的,具體可以參見例1中g(shù)etprice和gettitle函數(shù)的定義。
為什么要將這兩個(gè)函數(shù)定義成常成員函數(shù)呢?這兩個(gè)函數(shù)的功能我們知道就是為了返回price和title的,功能單一,并且不希望修改這兩個(gè)變量的,如此,定義成常成員函數(shù)是非常保險(xiǎn)的一種做法,可以避免在這兩個(gè)函數(shù)內(nèi)部修改成員變量。如果需要修改這兩個(gè)變量則只需通過setprice和settitle函數(shù)完成,因此設(shè)置為const是非常合適的。
常成員函數(shù)可以訪問類中的任何成員變量,但是不能修改任何成員變量。而普通的成員函數(shù)不能訪問常對(duì)象的成員變量,其它的成員變量都可以訪問,普通的成員函數(shù)可以修改的成員變量也只有非const成員變量了,一旦加上了const關(guān)鍵字加以修飾,初始化完成后就不能被修改了。還有一點(diǎn)需要注意的是const成員函數(shù)是不能調(diào)用類中非const成員函數(shù)的。
const對(duì)象
const對(duì)象定義的基本語法如下:
? ? const 類名 對(duì)象名(實(shí)參名);
? ? 類名 const 對(duì)象名(實(shí)參名);
這兩種定義方式都是可以的,我們一旦將對(duì)象定義為常對(duì)象之后,該對(duì)象就只能調(diào)用類中的常成員函數(shù)了。
在本例中,我們將類中的getprice、gettitle和display三個(gè)函數(shù)都聲明為了常成員函數(shù),之后在主函數(shù)中我們定義了一個(gè)常對(duì)象Alice,Alice作為一個(gè)常對(duì)象,只能調(diào)用常成員函數(shù),因此在調(diào)用display函數(shù)時(shí)沒有問題,但是在調(diào)用setprice函數(shù)時(shí)編譯報(bào)錯(cuò),因?yàn)閟etprice不是常成員函數(shù)。
有些時(shí)候我們?cè)诔绦蛟O(shè)計(jì)過程中要求修改常對(duì)象中的某個(gè)成員變量,這個(gè)時(shí)候如果是普通的成員變量是不能被修改的。為了滿足這一需求,C++提供了mutable關(guān)鍵字。
通過這樣的聲明將變量var聲明為可變的成員變量,此時(shí)如果要修改常對(duì)象的該變量時(shí),只需要通過常對(duì)象調(diào)用const成員函數(shù)修改該變量即可。
對(duì)象的const引用
在將對(duì)象作為函數(shù)參數(shù)的時(shí)候,通常我們會(huì)采用引用的方式作為函數(shù)參數(shù)。有時(shí)候?yàn)榱嗽诤瘮?shù)中避免對(duì)對(duì)象本身做出什么修改,在函數(shù)形參前加上const關(guān)鍵字。
#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函數(shù)聲明為頂層函數(shù),其函數(shù)形參為book類對(duì)象的常引用,在函數(shù)內(nèi)部我們首先調(diào)用public屬性的setprice函數(shù),企圖修改price成員變量,編譯無法通過。而在其后調(diào)用gettitle和getprice函數(shù)則沒有問題,因?yàn)檫@些函數(shù)沒有修改成員變量。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wanghuixi/p/7008231.html
總結(jié)
以上是生活随笔為你收集整理的C++ 之const的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux文件管理常用命令
- 下一篇: 大东电报与雷格斯在全球部署宝利通高清系统