如果在一个类声明中,在某个方法的声明最后加上关键字const就表示该方法(函数)已经被声明为常量成员函数(const member function)了。既然叫常量成员函数,也就意味着这种用法(在声明后加上关键字const)只针对某个类的成员函数来使用。
之所以有这样一个需求,初衷是为了防止类成员函数通过this指针来修改this所指向的成员对象。下面来看一个例子:
#include<iostream>
using namespace std;
class test
{
int value ;
public:
test(int v =0){value = v;}
int getValue() const
{
return this->value;
}
};
int main()
{
test t(1);
cout<<t.getValue()<<endl;
return 0;
}
此时test类中的getValue()方法就是一个常量成员函数,这样在这个函数中,value的值就不能被改变,否则将不能通过。若想改变,去掉后面的关键字即可。由此我们可以知道以下两点:
1.this 是一个常量指针,即this本身是一个常量,不能被修改;
2.this 指向的对象为非常量,在成员函数中可以被修改;若不想被修改,变成常量成员函数即可;
由此遇到的另一个问题:
struct Sales_data
{
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
string isbn() const {return bookNo;}
Sales_data& combine(const Sales_data&);
double avg_price() const;
};
为什么不能把string isbn() const {return bookNo;}的返回类型改为string&?
为什么编译会出错?
返回引用, 就意味着外部调用的时候, 可能对 bookNo 进行修改. 但你又对该成员函数进行了 const 修饰. 这又意味着, 外部调用者无权对该对象进行任何修改. 显然, 这两者是矛盾的. 于是编译器就困惑了…
为什么这儿不能返回引用?
当然可以返回引用, 但你要保证行为遵循逻辑, 如:
std::string& isbn() { return bookNo; } // 返回引用
const std::string& isbn() { return bookNo; } // 返回 const 引用
const std::string& isbn() const { return bookNo; } // 针对 const 对象返回 const 引用
上述三种改法, 都是可以的.