我对const的一点理解

以前一直以为const这个小东西挺简单的,而且也不怎么常用这东西,偶尔用个常数都用#define了,最近调程序和看书中老是出现这个限定词,觉得碍眼就好好看了看和它相关的用法,发现这东西牵扯的东西还不少,虽没到博大精深的地步,可也看得我眼疼。
首先,要认定的一点是,const经常用于定义常数,但其本意是只读限定的。其用法也都是围绕这一标准来的
1.    const与变量
这个基本没什么问题,带有const的变量可以赋给一个非const变量,而反之不可。即:
int i = 3;
const int j = 4;
i = j;// OK!!
j = i;//error!l-value specifies const object
这个很容易理解,const变量初始化后不能再改变了,我们只能读取它,但没办法修改。
2.    const与指针
const和指针配合,情况有些复杂,咱们直接看一个例子:
int a = 4;
int b = 3;
int *i = &b;
const int *j = &a;
cout<<"i: "<<i<<endl;
cout<<"j: "<<j<<endl;
j = i;
cout<<"j2: "<<j<<endl;
这个段程序是没问题的,运行正确,运行结果如下:
i: 0x0013FF78
j: 0x0013FF7C
j2: 0x0013FF78
也就是说,j指针的指向可以改变(开始指向a,后来指向了b),那么const的用处何在呢?我们可以试着改变*j的值,也就是j指针指向地址中的内容。结果是错误的,l-value specifies const object。而*i是可以这么干的。
现在可以明白了const int*只是不能用于修改整形数,但这个指针的本身的值却可以改变
但在上例中,如果用j来赋值i是编译错误的。cannot convert from 'const int *' to 'int *'。这点好像刚好和变量反过来。“可以将指向const对象的指针初始化为非const对象,但不可以让指向非const对象的指针指向const对象。”
int i = 42;
const int *p = &i;//OK!


const int i = 42;
int *p = &i;//error!!

3.    const与函数
const的真正应用其实是在函数形参部分以及常量成员函数中的应用。首先来看const形参的应用,在这里形参分为两种,一种是非引用形参,一种是引用形参。在调用函数时,如果该函数使用非引用的非const形参,则既可给该函数传递const实参也可传递非const的实参。这点一般人都知道,而且也不用刻意去记(既然都可以就没有记忆的必要了)。那么如果使用的是非引用的const形参要注意什么呢?因为形参是const,所以在函数中,不可以改变实参的局部副本。
下面来看引用形参中的const应用。这在引用形参中经常被用到,因为我们知道引用形参是可以改变实参的值的。这种方式确实方面的得到了一种我们想要的结果,但有时如果我们并不打算更改实参呢?比如我只是想把两个string对象对比一下。这个时候const就用得上了。
bool isShorter(const string &s1, const string &s2)
{
     Return s1.size()<s2.size();
}

非const引用形参只能与完全同类型的非const对象关联。也就是把一个const对象作为一个实参引用到子函数中是错误的。
在c++ Primer中提到了一个最佳方案:应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参(非const的)既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。懒得再自己想例子了,直接引用c++ Primer上的吧:
int incr(int &val)
{
   return ++val;
}
void main()
{
short v1 = 0;
const int v2 = 42;
int v3 = incr(v1); //error: v1 is not an int
v3 = incr(v2);     //error: v2 is const
v3 = incr(0);      //error: literals are not lvalue
v3 = incr(v1+v2);  //error: addition doesn't yield an lvalue
}
const的最后一个用法就是const成员函数的用法了,其实在成员函数的后面加一个const就是把隐含指针this改变成了const型,剩下的就不用说了吧,就是成员变量在其中只读而不能修改了。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值