国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

類的const成員函數

2019-11-08 02:24:26
字體:
來源:轉載
供稿:網友

類的const成員函數

類成員函數如果使用const進行修飾,則表明該函數不會修改該類的狀況,不會改變類成員信息等,如下所示:

class Date{ int d,y,m;public: int month()const;};

內部聲明時使用const后綴進行修飾,外部定義時也需要使用const進行修飾:

int Date::month() { return y++;}

如上使用就是錯誤的,第一:沒有加const后綴修飾,第二:改變了類的狀況,此時,該函數就能被編譯器檢測到,并且報錯 正確使用為:

int Date::month() const{ return y;}

類成員函數如果使用const進行修飾,則表明該函數不會修改該類的狀況,不會改變類成員信息等,如下所示:

class Date{ int d,y,m;public: int month()const;};

內部聲明時使用const后綴進行修飾,外部定義時也需要使用const進行修飾:

int Date::month(){ return y++;}

如上使用就是錯誤的,第一:沒有加const后綴修飾,第二:改變了類的狀況,此時,該函數就能被編譯器檢測到,并且報錯 正確使用為:

int Date::month() const{ return y;}

const成員函數能被const對象和非const對象調用,因為它本身不改變對象,所以它都能被調用;而非const成員函數只能被非const對象調用,因為函數可能會改變對象,這就違背了const對象不可變的特性。

對于const修飾的成員函數,如果需要修改類成員,可以使用const_cast強制去掉const,但是這種做法看起來并不美觀,但是在邏輯上是const的,但是確實需要改變成員函數,但是對使用者而言是const的,那么可以使用const_cast強制轉換:

int Date::month()const{ auto t=const_cast<Date*>(this); return ++(t->y);}

但是這個方法在類本身就是const的情況下是未定義行為,不一定起效,使用g++試了一下是能改變的。

當然最好還是使用mutable修飾需要改變的變量,mutable修飾的變量就是說該變量不可能是const的,使用mutable修飾之后再const函數中就可以正常的改變類成員了,即使是const的對象。

code:

#include<iostream>#include<cstdlib>using namespace std;class Date{ int d,m; mutable int y;public: int month()const; Date(int d,int m=1,int y=2016) { this->d=d; this->y=y; this->m=m; }};int Date::month()const{ return ++y;}int main(){ const Date d(1); cout<<d.month()<<endl; cout<<d.month()<<endl; return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 揭阳市| 铜陵市| 凉山| 滁州市| 广宁县| 阿拉尔市| 望谟县| 昆山市| 佛坪县| 驻马店市| 全州县| 连城县| 锦州市| 九龙县| 常熟市| 广平县| 彭州市| 颍上县| 凌云县| 昌黎县| 永新县| 曲靖市| 平遥县| 出国| 会昌县| 星子县| 漠河县| 呼玛县| 肥乡县| 宁强县| 若尔盖县| 广州市| 大庆市| 江安县| 泰顺县| 工布江达县| 乡宁县| 锡林郭勒盟| 涟源市| 元谋县| 滨州市|