上节说了const限定符在定义一个变量方面的应用,这一个我们来看看const限定符在函数里面的应用。
const形参与实参
按照我们前面的定义:
const int ci =42; //我们不能改变的值
void fun(const int i); { /* fun能够读取i,但是不能向i写值*/}
void fun(int i); /*错误,c++中不允许有两个同样的函数存在*/
在我们调用fun时,既可以传入const int,也可以传入i。c++中,我们允许定义若干相同名字的函数,不过前提是不同函数的形参列表应该用明显的区别。而在上述代码中传入两个fun函数的参数可以完全一样,因此第二个fun是错的。
尽量使用常量引用
常量引用是指对一个常量的引用,把函数不会改变的形参定义成(普通的)引用是一种比较常见的错误,这种做法会给调用者一个极大的误导,认为函数可以修改它的实参的值。还有,使用引用而非常量引用也会极大地限制函数所能接受的实参类型,例如,我们不能把const对象,字面值或者需要类型转换的对象传递给普通的引用形参:
string size_type find_char(string &s,char c,string occurs);
find_char("hello world",‘o’,ctr);
const成员函数
在这里我们引入了类和this指针的概念,我们先来定义个一个类和它的一个const成员函数:
struct Sales_data{
string isbn() const{ return bookNo};
}
当我们调用isbn(),成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象:
string isbn() const{ return this->bookNo};
函数之后的const限定符就是为了修改隐式this指针的类型。默认情况下,this类型是指向类类型非常量版本的常量指针。例如在Sales_data的成员函数中,this的类型是Sales_data *const,此时,紧跟在参数列表后面的const表示this是一个指向常量的指针,像这样使用const的成员函数被称作常量成员函数。
因为this是指向常量的指针,所以常量成员函数不能改变调用它的对象的内容。上例中,isbn可以读取调用它的对象的数据成员,但是不能写入新值。