const限定符的理解

     关于const,最经常看到用它来定义常量

const int bufSize = 512;

    常量也可以程序员自己定义,但它与普通的变量有一些差别。它不可以在定义后重新赋值,以上面代码为例,任何试图改变bufSize的赋值行为都是错的。因为它在创建后不可以重新赋值,所以在定义一个const对象时必须初始化:

int m = 10;
const int n = m;
const int i = get_size();
const int j = 42;

    const定义的常量在初始化时可以用其他 表达式 或字面值常量(const int j = 42; 中42就是字面值常量)初始化。
    默认情况下const对象只在文件内有效
    那么问题来了,如果我想在一个文件中定义一个const对象,在其他文件中使用,该怎么办?
    解决方法:无论在定义还是声明时都在const前加一个extern关键字

//file.cpp中定义并初始化常量
extern const int bufSize = 512;  
//file.h 声明bufSize
extern const int bufSize; //与file.cpp中定义的bufSize是同一个

const会有下面几种应用场景:

const的引用

    可以把引用绑定到const对象上,这种引用叫对常量的引用,对常量的引用不能用来修改他所绑定的对象。

const int ci = 1024;const int &r1 = ci; //引用及其对应的对象都是常量
r1 = 42; 		//错误:r1是对常量的引用,不能改它所绑定对象的值
int &r2 = ci 	//错误:非常量引用不能绑定常量对象

    引用的类型必须与其绑定对象类型相同,但当初始化对常量的引用时允许任意表达式作为初始值,只要改表达式的结果能转换成引用的类型即可,可以作为初始化对常量的引用的表达式可以是 非常量的对象,字面值,或是个一般表达式。这是因为C++处理对常量的引用定义时是这样做的:

double davl = 3.14;
const int &r = davl;
c++的编译器会吧上面const int &r = davl; 变为
const int temp = dval;
const int &r = temp;

    这样r绑定的实际上是编译器产生的一个临时量,这种处理方式也避免违反“引用的类型必须与其绑定对象类型相同”这个规定。

const指针

    1.指针中也存在指向常量的指针,它与对常量的引用类似,这种指针不能改变其所指对象的值,想要存放常量对象的地址,只能使用指向常量的指针:

const int a = 10;
const int *pa = &a;

    2.指针与引用不同,指针是对象而引用不是,所以指针也可以定义为常量

int a = 10;
int *const pa = a;
*pa = 20;//此时若cout << a <<endl; 可以看到a的值被改为20

    在定义常量指针时必须初始化,常量指针是常量,所里它的值不能改变,但是它所值的对象如果不是常量,则可以通过它修改其所指对象的值。

顶层const 与底层const

    因为指针本身是对象,同时又可以指向另一个对象,所以指针本身是否为常量和其所指对象是否为常量就是两个问题。顶层const就是表示指针本身是常量,底层const表示指针所指对象是常量。


const int var_1 = 10;
int var_2 = 20;
constint *pvar_1 = &var_1;
int *constpvar_2 = &var_2;

    如果定义一个指针时既有顶层const又有底层const则这个指针是一个指向产量的常量指针。

const int *const pvar_3 = &var_2;
const成员函数

const可以在面向对象设计中,用于定义类的const成员函数,定义方式时在函数后加const关键字

class obj{
public:
    int getVar1() const
    {
    	return var1;
    }
    int setVar1(int val)
    {
    	var1 = val;
    }	
private:
	int var1;
};

const成员函数不能修改类对象,此处const实际是用来修饰this指针的底层const,我们无法通过底层const指针改变指针指向的值。

今天先写这些,以后还会再加;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bob_cap

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值