亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問常量成員函數的返回值為什么不可以使引用類型呢?求教

請問常量成員函數的返回值為什么不可以使引用類型呢?求教

HUH函數 2022-10-20 19:11:43
比如:string& get_name() const {return name;}編譯器就會出錯,顯示無法從const string對象轉換到 string對象??墒莕ame在聲明時沒有定義為const啊,難道const成員函數把數據成員也改為了const??
查看完整描述

3 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

在C++中,若一個變量聲明為const類型,則試圖修改該變量的值的操作都被視編譯錯誤。例如,

const char blank = ‘’;
blank = ‘\n’; // 錯誤

面向對象程序設計中,為了體現封裝性,通常不允許直接修改類對象的數據成員。若要修改類對象,應調用公有成員函數來完成。為了保證const對象的常量性,編譯器須區分不安全與安全的成員函數(即區分試圖修改類對象與不修改類對象的函數)。例如,

const Screen blankScreen;
blankScreen.display(); // 對象的讀操作
blankScreen.set(‘*’); // 錯誤:const類對象不允許修改

在C++中,只有被聲明為const的成員函數才能被一個const類對象調用。
要聲明一個const類型的類成員函數,只需要在成員函數參數列表后加上關鍵字const,例如,

class Screen {
public:
char get() const;
};

在類體之外定義const成員函數時,還必須加上const關鍵字,例如

char Screen::get() const {
return _screen[_cursor];
}

若將成員成員函數聲明為const,則該函數不允許修改類的數據成員。例如,

class Screen {
public:
int ok() const {return _cursor; }
int error(intival) const { _cursor = ival; }
};

在上面成員函數的定義中,ok()的定義是合法的,error()的定義則非法。
值得注意的是,把一個成員函數聲明為const可以保證這個成員函數不修改數據成員,但是,如果據成員是指針,則const成員函數并不能保證不修改指針指向的對象,編譯器不會把這種修改檢測為錯誤。例如,

class Name {
public:
void setName(const string &s) const;
private:
char *m_sName;
};

void setName(const string &s) const {
m_sName = s.c_str(); // 錯誤!不能修改m_sName;

for (int i = 0; i < s.size(); ++i)
m_sName[i] = s[i]; // 不好的風格,但不是錯誤的
}

雖然m_Name不能被修改,但m_sName是char *類型,const成員函數可以修改其所指向的字符。
const成員函數可以被具有相同參數列表的非const成員函數重載,例如,

class Screen {
public:
char get(int x,int y);
char get(int x,int y) const;
};



查看完整回答
反對 回復 2022-10-24
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

可能是因為函數聲明后面的那個const,有這個const表示該類的對象是不可以改變的,但是返回值很可能改到該對象的什么東西,所以編譯器自動在前面加上const。你可以把后面的const去掉試一下。

查看完整回答
反對 回復 2022-10-24
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

你使用了后限定符const就是相當于對編輯器保證了不改變函數中變量的值,而返回卻返回了一個引用類弄這就是犯了傳址過程中const型對象傳給非const對象的錯誤,如果不想改變函數聲名而又想讓非const變量可以進行傳遞,可以使用mutable關鍵字進行修飾

查看完整回答
反對 回復 2022-10-24
  • 3 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號