const value_type *p,value_type const *p 和 value_type *const p的区别

这篇博客主要记录 const value_type *p,value_type const *p 和 value_type *const p

一个叫常量指针,const int* p,为了区别,我一般叫这个为指向常量的指针

一个叫指针常量,int* const p,这个叫指针常量

我的理解是:const 向左边起作用,如果const出现在最左边就只能对右边起作用。

① const value_type *p:p是指向value_type数据类型的一个指针变量。const出现在最左边就只能对右边起作用。所以const修饰的是value_type(内容),表示p指向的内容不能通过*p进行修改!但是p可以指向其他位置

② value_type const *p :const 向左边起作用,所以同上。

value_type *const p:const 向左边起作用,所以const修饰的是 * 操作符(指向)表示指针p的指向不能改变,但是可以通过*p解引用修改p指向位置的内容!

可以通过下面这个例子加深理解。

#include
using namespace std;

int main()
{
	int a=100;
	// 使用引用,b是a的别名,b的类型是int&,操做b等价操做a 
	int& b = a;
	 
	// 定义了常整形变量c,其值不能改变
	const int c = 200;
	//	c=12;error read-only valaribale 'c'
	
	int h = 200;
	// 可以理解为const是向左起作用的,如果const在是第一个那么只能向右起作用 
	// const向前起作用,但是const是第一个,所以只能向后作用,作用在int上,说明其作用的值不能修改,但是指针的指向可以修改 
	// 所以不能通过解引用改变c的值,但是d指针的指向可以改变  
	const int* d = &h;
	d = &a;
	// *d = 30; error,不能通过解引用修改内容 
    
    // const修饰前面,指针是一个常量,所以指针的指向不能改变,但是可以通过解引用修改地址内容 
	int *const q = &a;
	*q = 200; 
	//	q = &c;error,指针指向不能改变 
	
	 
	int e = 3;
	const int* x = &e;// const修饰int,指向可以改变,内容不能改变 
	int const* y = &e;// const修饰* ,指向不能改变,内容可以改变 
	return 0;
 } 

2018.11.11补充:

常对象只能调用常成员函数

指向常对象的指针也是只能调用常成员函数(该函数返回的是指针域),所以:当成员函数的返回值为一个指向节点的指针时,通常应有两个版本的成员函数,一个为常量版,返回一个const node*值;另一个为普通版,返回一个指向节点的普通指针。

补充:

const的用法:

  1. 修饰变量,说明该变量不可以被改变;
  2. 修饰指针,分为指向常量的指针和指针常量;
  3. 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改;
  4. 修饰成员函数,说明该成员函数内不能修改成员变量。

你可能感兴趣的:(C++基础)