国产探花免费观看_亚洲丰满少妇自慰呻吟_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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 商城县| 蒙自县| 太康县| 武山县| 通城县| 樟树市| 藁城市| 孝感市| 雷波县| 手游| 长丰县| 松滋市| 乡城县| 长顺县| 靖边县| 仙游县| 高州市| 谷城县| 高尔夫| 建湖县| 南投县| 泸溪县| 彰武县| 德州市| 伊吾县| 太原市| 靖安县| 商水县| 高密市| 扶沟县| 乡城县| 明水县| 伊金霍洛旗| 东乡县| 阿城市| 宁乡县| 阳高县| 娱乐| 手游| 静乐县| 南宫市|