一、用const修饰函数的参数##
函数参数类型前加const指明该参数为常量,在函数内部不可改变。
void func(const int x) {
//x不可以在内部进行赋值等操作.
}
注:当参数为引用传递或者指针传递作为输出时,都不能加const
二、用const修饰函数的返回值##
函数返回时,会把返回值复制到外部临时的存储单元中,存储类型由函数的返回类型来确定。
- “值传递”加const修饰没有任何价值。
- ”址传递”加const修饰,函数返回值只能被赋给加const修饰的同类型指针,或者利用const_case转化为去const的常量。
const int* func(void) //函数声明
...
int* a = func(); //报错
int* c = const_cast<int*>(func()); //正确
const int* b = func() //正确
- "引用返回",引用即为const指针,函数返回引用并加const限定后,函数返回的是地址与地址所存的值都被const修饰的指针,存于临时的外部存储单元中,
const int& func(); //函数声明
...
int b = func(); //正确,从外部存储单元中赋值给变量
int& c = func(); //错误,试图在同一个地址中即存储变量又存储常量
int& d = const_cast<int&>(func()); //正确,去const
const int& e = func(); //正确
如果上面错误的例子看不懂可以看之前的const修饰符限定的常量指针const与non-const赋值部分。
引用返回总结
引用返回一般很少用,但既然选择引用返回,返回的肯定是一个作用域高于函数作用域的变量的引用,毕竟函数作用域下的变量在函数结束后会释放掉(static这里不考虑)引用即为该变量的const指针,既然选择返回指针,就想通过直接利用指针修改该地址下的变量,所以就更没有必要返回const引用,毕竟const引用的返回值不希望对地址所存的值进行修改。引用返回更常用的方式是:
int& func();
...
int& a = func();
这一可以通过a来改变返回值。
三、const 成员函数##
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。
class test
{
public:
void func(){}
int getNum(void) const // const 成员函数
{
++num; // 编译错误,企图修改数据成员m_num
func(); // 编译错误,企图调用非const函数
return num;
}
private:
int num;
};