const的位置摆放

序言顶层const与底层constconst int variate 与 int const variatestatic const int variate 与 static int const variateconst int * pointer与int const * pointerint * const pointerconst int function()与int const function()const int &function()与int const &function()const int * function()与int const * function()int * const function()void function( const 参数 )void function() const

序言

相信很多人总是容易忘记const放哪个位置是什么意思,我也是,所以特地记录下const关键字的用法。

修饰前面的类型的,使指针指向值不能更改为常量指针,pointer to const; 修饰后面*号的,使指针无法更改指向地址的为指针常量,const pointer。

注:指针常量和常量指针属于“俗语”,具体来源于谁已不可究,正规官方的翻译术语是: 指向常量的指针(pointer to const):不能用于改变其所指对象的值 常量指针(const pointer):必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。 —— 摘自《Primer c++ 第5版》 .

顶层const与底层const

顶层const:修饰对象本身是const常量的,如指针常量; 底层const:修饰对象所指向的对象是const常量的,如常量指针和常量引用。 以指针为例, int * const pointer;这是指针常量,const修饰的是*,不可更改指向; const int * pointer;这是常量指针,const修饰的是int,不可更改值; const int * const pointer这是常量指针也是指针常量,既不可更改指向值,也不可更改指向。

.

const int variate 与 int const variate

修饰int,表示variate不可修改,普通变量需要直接初始化。

const int variate 和int const variate 是一样的,都是const修饰int。

const int variate = 5;

如果是非静态的类成员变量,可通过构造函数初始化

class test

{

public:

test():variate (5)

{}

const int variate;

}

.

static const int variate 与 static int const 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;

.

const int * pointer与int const * pointer

修饰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。

.

int * const pointer

修饰*,修饰指向的地址,使指向的地址不可修改, 但该改变指向的值,相当于引用,即指针常量。

*pointer可改,pointer不可改

例子:

int a = 5;

int b = 6;

int * const pointer = &a;

*pointer = 7; //OK

pointer = &b; //Error

通俗来说,就是这个指针指向的,不能改变地址,但是改变它的值。此处的const属于顶层const。 . .

const int function()与int const function()

const int &function()与int const &function()

修饰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 * function()与int const * function()

其实与指针的const int * pointer和int const * pointer差不多,具体可看上面的解释。

这个返回值必须使用相同类型的变量进行赋值或者相同类型的形参进行值传递。

修饰返回值指针所指向的值,使其不可更改,但是这个指针可以随时指向其它的地址。

const int * function()

{

...

}

int main()

{

const int * pointerA = function(); //OK

int * pointerB = function(); //Error

return 0;

}

.

int * const function()

其实与int * const pointer的差不多,具体可看上面的解释。

这个返回值必须使用相同类型进行赋值。

修饰返回值指针所指向的地址,使其不可更改,但是这个指针的值可以任意更改。 .

void function( const 参数 )

参数的与上文所述普通的变量,引用,指针的const用法一致,看上文对应的作为参数即可。 .

void function() const

放在函数后面的const是修饰函数,而实际是修饰传进来的this指针。

在函数后面放const只能修饰非静态的成员函数,静态及普通函数都会编译错误。

因为这个const根本就不是修饰函数,你可以认为这是修饰传进来的this指针的类型,其作用就是表明,这个函数里,任何修改成员变量的代码都是无法编译通过的。

class test

{

public:

void function() const

{

int a;

variate = 3; //Error

a = 4; //OK

}

int variate;

}

如果有任何错误的地方或者漏的地方,欢迎留下评论或者私聊跟我说,若真是错的我立即改正,漏的我立即补充。