相信很多人总是容易忘记const放哪个位置是什么意思,我也是,所以特地记录下const关键字的用法。
修饰前面的类型的,使指针指向值不能更改为常量指针,pointer to const;
修饰后面*号的,使指针无法更改指向地址的为指针常量,const pointer。
注:指针常量和常量指针属于“俗语”,具体来源于谁已不可究,正规官方的翻译术语是:
指向常量的指针(pointer to const):不能用于改变其所指对象的值
常量指针(const pointer):必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。
—— 摘自《Primer c++ 第5版》
.
顶层const:修饰对象本身是const常量的,如指针常量;
底层const:修饰对象所指向的对象是const常量的,如常量指针和常量引用。
以指针为例,
int * const pointer;
这是指针常量,const修饰的是*,不可更改指向;
const int * pointer;
这是常量指针,const修饰的是int,不可更改值;
const int * const pointer
这是常量指针也是指针常量,既不可更改指向值,也不可更改指向。
.
修饰int,表示variate不可修改,普通变量需要直接初始化。
const int variate
和int const variate
是一样的,都是const修饰int。
const int variate = 5;
如果是非静态的类成员变量,可通过构造函数初始化
class test
{
public:
test():variate (5)
{}
const int variate;
}
.
修饰int,表示variate不可修改,与静态普通变量一样需要直接初始化。
static const int variate
和static int const variate
是一样的,都是const修饰int。
static const int variate = 5;
如果是静态的类成员变量,需在类外进行初始化
class test
{
public:
static const int variate;
}
const int test::variate = 5;
.
修饰int,修饰指向的内容,使指向的内容不可修改,
但该改变指向的内存空间,相当于只读属性的指针,即常量指针。
const int * pointer
和int const * pointer
是一样的,都是const修饰int。
*pointer不可改,pointer可改
例子:
int a = 5;
int b = 6;
const int * pointer = &a;
*pointer = 7; //Error
pointer = &b; //OK
通俗来说,就是这个指针指向的,不能改变值,是只读的,但是指向可以指向另一个值的地址。此处的const属于底层const。
.
修饰*,修饰指向的地址,使指向的地址不可修改,
但该改变指向的值,相当于引用,即指针常量。
*pointer可改,pointer不可改
例子:
int a = 5;
int b = 6;
int * const pointer = &a;
*pointer = 7; //OK
pointer = &b; //Error
通俗来说,就是这个指针指向的,不能改变地址,但是改变它的值。此处的const属于顶层const。
.
.
修饰int的返回值,按理说是想表明返回值不可修改,即返回的值都不准改变,如果是和返回值一致的变量来赋值的话,确实可以。
但是这更多像是无病呻吟,因为如果我将返回值赋值到一个int类型的一样可以,这是因为隐式转换的结果。
const int function()
{
...
}
int main()
{
const int variateA = function(); //OK
int variateB = function(); //OK
variateA = 4; //Error
variateB = 4; //OK
return 0;
}
.
其实与指针的const int * pointer
和int const * pointer
差不多,具体可看上面的解释。
这个返回值必须使用相同类型进行赋值。
修饰返回值指针所指向的值,使其不可更改,但是这个指针可以随时指向其它的地址。
const int * function()
{
...
}
int main()
{
const int * pointerA = function(); //OK
int * pointerB = function(); //Error
return 0;
}
.
其实与int * const pointer
的差不多,具体可看上面的解释。
这个返回值必须使用相同类型进行赋值。
修饰返回值指针所指向的地址,使其不可更改,但是这个指针的值可以任意更改。
.
参数的与上文所述普通的变量,引用,指针的const用法一致,看上文对应的作为参数即可。
.
放在函数后面的const是修饰函数,而实际是修饰传进来的this指针。
在函数后面放const只能修饰非静态的成员函数,静态及普通函数都会编译错误。
因为这个const根本就不是修饰函数,你可以认为这是修饰传进来的this指针的类型,其作用就是表明,这个函数里,任何修改成员变量的代码都是无法编译通过的。
class test
{
public:
void function() const
{
int a;
variate = 3; //Error
a = 4; //OK
}
int variate;
}
如果有任何错误的地方或者漏的地方,欢迎留下评论或者私聊跟我说,若真是错的我立即改正,漏的我立即补充。