对于C++中的const用法的总结

C++中由于有指针的存在,所以const的限定就不仅仅是对于一个普通变量的值的限定了。个人总结如下:

const int bufSize = 1024;

上述语句是定义了一个int类型的变量bufSize,并且bufSize的值固定为1024,不能改变了。

对于一个非const变量,假设已经做了合适的声明,就可以在另外的文件中使用这个变量,代码来自C++ Primer中文版第四版:

//file_1.cc
int counter;//definition
//file_2.cc
extern int counter;//uses counter from file_1
++counter;//increments counter defined in file_1.cc


与其他变量不同,在全局作用域中声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。

通过制定const变量为extern,就可以在整个程序中访问const对象:

//file_1.cc
extern const int bufSize = fcn();//definition
//file_2.cc
extern const int bufSize;//uses bufSize from file_1
for(int index=0;index !=bufSize;++index)
//...


下面讨论const在引用(reference)中的应用。

const引用时指向const对象的引用:

const int ival = 1024;
const int &refVal = ival;
int &ref2 = ival;//error


上述写法第三行是错误的,一个非const引用不能引用一个const的对象。

const引用可以初始化为不同类型的对象或者初始化为右值:

int i=42;
const int &r =42;
const int &r2 = r + i;

同样的初始化对于非const引用却不是合法的,而且会导致编译时的错误。下面解释一下:

double dval = 3.14;
const int &ri = dval;

编译器会将上述代码转换为以下形式:

int temp = dval;
const int &ri = temp;

如果ri不是const的,那么可以修改ri的值,也就是你可能期待的修改dval的值,但是事实上dval并没有被修改,只有temp的值被修改了。所以仅允许const引用绑定到需要临时使用的值完全避免了这个问题,因为const给予了只读的特性。

接下来看看指针和const之间的一些特性。

指向const对象的指针,以一个例子来说明:

const double* cptr;

这里的cptr指向了一个double类型的const对象,这个对象的值不能被改变,这里的const只是限定了cptr所指向的对象,并没有限定cptr本身。也就是说,可以给cptr重新赋值,让它指向另外一个double类型的const对象。但是不能通过cptr修改所指向对象的值。

*cptr = 9;


这种写法就是错误的!

不能使用void*指针保存const对象的地址,而必须使用const void*来保存:

const int i = 42;
const void *cpv = &i;
void *pp = &i;//error

上面的第三行写法就是错误的!

允许把非const对象的地址赋值给指向const对象的指针,所以指向const的指针所指向的对象的值不是一定不能被修改!这句话很绕,来个例子说明:

double p = 9.0;
const double* cp = &p;

上面cp,从字面理解是不能通过它修改它指向的p的值,但是可以通过其他的方式修改p的值,例如:p=0.0;


const指针,本身的值不能被修改。

int i=0;
int *const p = &i;

虽然指针本身不能被修改,也就是:不能指向其他对象。但是指针指向的对象的值是否能被修改就没有确定。因为指针所指向对象的值是否能被修改取决于指针的类型前面是否有const。

const double pi = 3.14;
const double *const pip= pi;

上面的pip就是自身不能改变,并且所指向的对象的值也不能被改变。

下面看一个非常经典的问题:

typedef string *pstring;
const pstring cstr;

请问cstr是什么类型的变量?

如果你以为是:const string* cstr;那就错了!

错误的原因在于:将typedef当做文本扩展了。声明const pstring的时候,const修饰的是pstring类型,而pstring是一个指针,所以应该相当于:

string *const cstr;

如果还没弄清楚的话,我觉得可以类比:

const pstring cstr;与const int ex;对比,后者表示ex的值不能被修改,前者也是一样,表明cstr的值不能被修改,由于pstring是指针,而如果指针的值不能被修改,就应该是const放在指针类型的后面,也即:string *const cstr;

目前就总结到这里,大部分都来源于c++ primer 第四版,然后加上一些自己的理解。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值