c++类中遇到的const
class ConstSummary {
public:
ConstSummary()
: m_nId(0){
}
#ifdef CONST_RETURNED
const int & id() {
return m_nId;
}
#endif // CONST_RETURNED
#ifndef CONST_RETURNED
int & id() {
return m_nId;
}
#endif // !CONST_RETURNED
void printId() const {
qDebug() << m_nId;
}
void operateClassMembers() const {
// m_nId++; // error:表达式必须是可修改的左值
// id(); // error
printId(); // succ
}
void setId(const int & nId) {
m_nId = nId;
}
private:
int m_nId;
QString m_str;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ConstSummary cs;
#ifdef CONST_RETURNED
cs.id() = 1; // 不可通过引用修改对象成员,编译报错,若需要修改对象,提供set接口
#endif // CONST_RETURNED
#ifndef CONST_RETURNED
cs.id() = 1; // 通过引用修改了对象成员,该函数为获取id的功能,此时不应该修改成员
#endif // !CONST_RETURNED
return a.exec();
}
1.成员函数返回值为const
返回值为const时,返回的引用对象为不可修改的左值,即不可对返回对象的引用赋值。这里为什么返回引用而不是一般类型。若是一般类型,在返回时,返回的仅是一个返回值即data,此时可以看作是一个常量,那么对这样一个函数赋值,相当于对const 常量赋值,编译器自然会提示出错误。
// 如上省略类声明...
int id() {
return m_nId;
}
// ...
cs.id() = 1; // error
2.成员函数为const
成员函数为const时,函数中不可对成员变量进行修改,否则编译报错;另外,不可在函数中调用非const类型的成员函数,因为非const成员函数中的代码块可能进行了修改成员变量的操作。c++语法中,const类型的成员函数中仅可以调用const类型的成员函数。
3.成员函数的参数为const
成员函数的参数为const时,通常是const 引用,保证外部传入的数据在成员函数中不被修改,另外加上引用,可以不需要拷贝一份临时对象。