一. 在 C 语言中主要有如下的情况:
1. const int a;
2. int const a;
3. const int *a;
4. int* const a;
5. int const *a const;
分析:
对于1,2 的作用是一样的,代表 a 是一个常整形数。
对于 3 意思是说 a 是一个指向常整形数的指针,也就是说整形数是不可以修改的,但指针可以。
对于 4 意思是说 a 是一个指向整形数的常指针,也就是说指针指向不可变,但整形数可以变。
对与 5 意思是说 a 是一个指向常整形数的常指针,也就是说指针的指向与整形数都不可改变。
二. 在C ++ 中主要有如下的情况:
1. 用const修饰函数的参数
函数参数类型前加const指明该参数为常量,在函数内部不可改变。
*void func(const int x) {
//x不可以在内部进行赋值等操作.
}
*
注:当参数为引用传递或者指针传递作为输出时,都不能加const**
2.用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(); //正确
引用返回总结
引用返回一般很少用,但既然选择引用返回,返回的肯定是一个作用域高于函数作用域的变量的引用,毕竟函数作用域下的变量在函数结束后会释放掉(static这里不考虑)引用即为该变量的const指针,既然选择返回指针,就想通过直接利用指针修改该地址下的变量,所以就更没有必要返回const引用,毕竟const引用的返回值不希望对地址所存的值进行修改。引用返回更常用的方式是:
int& func();
...
int& a = func();
这一可以通过a来改变返回值。
3.const 成员函数
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。
```cpp
class test
{
public:
void func(){}
int getNum(void) const // const 成员函数
{
++num; // 编译错误,企图修改数据成员m_num
func(); // 编译错误,企图调用非const函数
return num;
}
private:
int num;
};