在成员函数中,const可以位于返回值前,可以位于参数前面,甚至可以位于函数声明末尾,它们之间的联系和区别经常容易被搞混,于是我写了这篇博客总结了一下。
首先有如下几个函数声明
T func(); //(1)
const T func(); //(2)
T& func(); //(3)
const T& func(); //(4)
T func()const; //(5)
const T func()const; //(6)
T& func()const; //(7)
const T& func()const; //(8)
我们知道,不能只凭借返回只类型来重载函数,但是函数末尾的const可以用来重载函数,因此在一个类中,如果出现两个函数的话一定是(1)or(2)or(3)or(4) + (5)or(6)or(7)or(8) 的形式
函数末尾的const有两个作用:1、进行重载;2、对函数体内的修改权限进行限制
先谈谈作用1:重载。当类中同时存在这两种函数时,普通对象会调用普通函数,const对象会调用const函数;当类中只有const函数时,无论普通函数还是const函数都调用const函数;当类中只有普通函数时,只有普通对象能调用该函数,const对象调用该函数时会报错,由此可以得到一个比较有用的结论:当打算在类中只设计一个const函数的时候,不必担心普通对象调用会报错。
再谈谈作用2:限制。当成员函数末尾加上const以后,在函数语句体内就无法对类的成员变量进行修改了,也即在函数语句外是可以修改的,那怎么修改呢?考虑(7)和(8),(7)中返回值是一个引用,假如这里返回一个成员变量的引用,那么在返回以后的后续操作中就可以修改该成员变量的值了,这并不与函数末尾的const矛盾,当然,使用(8)式可以做到即返回引用,又不至修改引用的变量的值。总结一句话:函数末尾加上const以后并不意味和这个函数有关的一切操作都不会修改成员变量的值(可以通过返回成员变量引用做到)