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;
};

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

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