C/C++ const简解——const的各种位置记录说明

const的位置摆放

  • 序言
  • 顶层const与底层const
  • const int variate 与 int const variate
  • static const int variate 与 static int const variate
  • const int * pointer与int const * pointer
  • int * const pointer
  • const 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 * pointerint 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 * pointerint 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;
}

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

你可能感兴趣的:(C/C++,c++,c语言)