C++ Primer const

const限定符

有时候我们需要定义这样一种变量,它的值不能被改变。例如,我们用这个变量表示缓冲区的大小。为了满足这一需求,我们可以使用const关键字对变量类型加以限定。

const int BuffSize=512    //无法改变的缓冲区大小数值

因为const对象一旦创建后其值便不可改变,所以const对象必须初始化。

const int i=get_size(); //正确,运行时初始化
const int j=666;        //正确,编译时初始化
const int k;			//错误,变量k需要设定预定值

默认状态下,const对象仅在文件中有效。若要使多个文件共享const,即在一个文件中定义const,在其他文件中声明并使用。则可在声明或者定义前加上extern关键字

extern const int BuffSize=512;    //fileA定义并初始化一个常量

extern const int BuffSize         //fileB声明并可使用

const与引用

  1. 下面的做法,看似要使引用绑定的对象不变。其实,引用本身并不是一个对象,而C++也不允许随意改变引用所绑定的对象。下例const只能保证无法通过k来改变k与par1共同的值。
	int par1 = 1;
	int par2 = 2;
	const int &k = par1;
	k = par2;   //错误,表达式必须是可修改的左值。
	par1 = 3;
	cout << k << endl;  //k=3 上
  1. 把引用绑定到const的对象上,称之为对常量的引用
const int par3=1024;
const int &r1=ci;
int &r2=par3 ;	//错误,试图让非常量引用指向常量对象(防止通过修改引用来改变常量对象值)。

const和指针

  1. 指向常量的指针不能通过指针改变对象值;常量指针的地址无法改变 ;const靠近谁,谁(指针值,对象值)便是常量(该原则只适用于const指针)。
	int a = 20;
	const int *pi1 = &a;     //指针所指对象为常量。(靠近int )
	int  *const pi2 = &a;	 //指针为常量指针,指针将一直指向a。(靠近*)
	cout << ++(*pi1) << endl;//错误,表达式必须是可修改的左值。(不能通过指针改变对象值)
	pi1 = pi2;				 //正确
	pi2 = pi1;				 //错误(常量指针的地址无法改变)
  1. 要想存放常量对象的地址,也只能通过指向常量的指针。
	const int b = 10;
	int *pi3 = &b;  //错误,const int *型实体不能用于初始化 int *类型实体

顶层const与底层const

  1. 顶层const表示指针本身是一个常量,更一般的,顶层const可表示任意对象是常量。就第二句话,你可以认为我们所定义任意对象的对象名是对象值的一个指针。
	int i = 0;
	int *const p1 = &i;  //顶层const,指针p1地址不可修改
	const int ci = 10;	 //顶层const
  1. 底层const表示指针所指对象为常量。
	const int ci=10;
	const int *p2 = &ci;  //底层const,对象ci为常量
	const int *const p3=p2; //第一个const为底层const(靠近int 所指对象为常量),第二个为顶层const
  1. 声明引用的const均为底层const。引用本身并不是对象,且绑定的对象无法随意改变,所以无const与非const之分。
	const int ci=10;
	const int &r=ci;

constexpr与常量表达式

  1. 常量表达式指值不会改变且在编译过程就能得到结果的表达式。
	const int max = 32;			//是常量表达式
	const int limit = max + 1;	//是常量表达式
	int BuffSize = 512;  		//值可能会改变
	const int sz = get_size();	//编译过程无法得到结果
  1. 可将变量声明为constexpr类型来验证变量值是否是常量表达式.。
	constexpr int mf = 20;			//是常量表达式
	constexpr int limit = mf + 1;  	//是常量表达式
	constexpr int sz = size();		//只有当size()是constexpr函数时才正确。
  1. 字面值类型即类型简单,值显而易见的类型,包括算术类型,引用与指针自定义类型Sales_item,IO库,string类型则不属于字面值类型,只有字面值类型可被定义为constexpr。
  2. 在constexpr声明中如果定义了一个指针,constexpr限定符仅对指针有效。
	int a = 10;
	const int *p1 = &a;		//指向整型常量的指针
	constexpr int *p2 = NULL;	//指向整数的常量指针  p2: int *const 

指针,常量,类型别名

  1. 注意以下情况。pstr为指向char的指针,用const修饰pstr后,类型为指向char的常量指针。
	typedef char* pstr;
	const pstr p1 = "asd";	//char *const p1;

const与类

  1. const类成员


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值