const是特别容易弄混的一点,现在以int和const来说,它的使用方式一般有以下几种:
int const、const int 、
int const* 、const int*、int * const、const int* const、int const * const
int const &、const int &
int const 、const int
int const 和const int是等价的,定义int const a;那么a的值是不能改变的,可以用变量对其进行初始化,一旦初始化后,a的值就不能再变了,如下:
由图可知,int const a或const int b与int a或int b的区别在于int const a或const int b中的a或b是只读的,其余和int一样。
int const*、const int*
int const* 和 const int * 也是等价的,定义int const * a,那么a即是指向常量的指针,不能用其来改变其指向的值,其与int * 的区别如下图所示。
由图可知,int const* a或const int *b中,(*a)或(*b)是只读的,其余和普通的int * 一样。
*即:指针指向的内存地址(a)可变,内存单元中的值(a)不能改变。
int* const
定义int* const a,那么a的值就不能改变了,即该指针指向的地址不能改变。一旦指向了某个变量,那么就不能再指向其他变量了,地址本身也不能改变。如下:
由图可知,a是只读的,不能对其进行修改,其余与普通的int * 一样。
*即:指针指向的内存地址(a)不能改变,但是内存单元中的值(a)可以改变。
const int * const 、int const * const
根据前面的const int * 和 int *const,不难推出const int * const的特点了,const int * const和int const * const也是等价的。如图所示:
由图可知,这里的const int * const a或int const * const b中,a和(*a)或b和(*b)都是只读的,其余与int * 一样。
*即:指针指向的内存地址(a)以及内存单元中的值(a)均不能改变。
int const &、const int &
int const&和const int&是等价的,定义int const &a=b,那么a的值就不能变了。
由图可知,int const& a或const int& b中,a或b是只读的,其余与int &一样。
总结一下:
类型 | 只读项 |
---|---|
int const a/(const int a) | a |
int const *a/(const int *a) | *a |
int *const a | a |
int const *const a/(const int *const a) | a、*a |
int const &a/(const int &a) | a |
此外,const也会用于函数中,如:
const function(p1,…){…}
表示函数的返回值为const型的;
假设在类A中重载+运算符:
class A
{
public:
int a;
A operator+(const A & x)
{
A res;
res.a = this->a + x.a;
return res;
}
}
如果按照上面的写法,那么就有可能出现
// A a1,a2,a3
...
a1 + a2 = a3;
但是编译器并不会报错,但是如果为重载+运算符的返回值加上const,那么a1+a2就成为一个不可变的值,编译器就会对a1 + a2 = a3这一行为报错。
type function(p1,…)const{…}
一般用于类中的成员函数,表示该函数不会修改类中的数据成员