C++中的const用法【01】----常量与指针

const 的设计之初是用来代替#define,后来它的身影逐渐扩大到了指针,函数参数,函数返回值类型,类与对象以及成员函数中。const 虽然对他们的作用稍有区别,但思想仍然是统一的。

可以说const 使用的恰当与否,直接关系到程序的高效与稳定。因此我在下面的文章中,简单介绍一下const 的基本用法与一些使用经验,希望对正在学习的朋友有所帮助。



1. 值代替
在C语言中,预处理器可以不受限制的建立宏并且用它来代替变量。
#include N 10
但预处理器有一个缺点,它只能做简单的文本代替,但无法像一个真正的变量那样进行类型检查(事实上,它也根本没有类型检查的概念),因此难免会产生一些难以发现的错误。
在C语言中,const 含义是“一个不能被改变的普通变量”。
而如果利用const 来代替#include,写成如下形式:
const int n = 10 ;
这样,const 可以防止意外的更改,并且消除了读内存以及存储器的操作,从而提高了效率。

并且在C++中,const 修饰的变量一定要在定义的同时就进行初始化,因为一旦划分好存储单元,这块单元就变为只读,不能再写入。



2. const 与指针
我们分下列3中情况讨论:
①const 修饰指针所指向的对象,即指向const 对象的指针;
②const 修饰指针中存储的地址,即const指针;

③const 既修饰指针本身,又修饰指针所指向的对象;



下面我们分开来介绍它们

①指向const 的指针
定义指针的技巧是从标示符的开始出读它,并从里向外。
const int * pInt ;
pInt是一个指针,它指向const Int ,这种情况下pInt不需要初始化,因为const 修饰的是它指向的对象而不是他本身。对指向const 对象的指针的操作与指向普通对象指针的操作相同。只是它所指向的对象不能更改。
而另一种形式比较容易混淆:
int const * pInt ;
这样的声明方法与上一种略有不同,但都表示“pInt是一个指向const int 的指针”
不论是const int * pInt 还是int const * pInt ,const 都主动把自己和 int 而不是 * 结合在一起,两种声明的形式虽然不同,但效果都相同。显然int const * pInt 更容易混淆,因为它同 int 和 * 都接触。因此将指向const 对象的指针声明为形如“const int * pInt ;” 这样的形式会使得程序更具有可读性。
②const 指针
const 指针意为“指针本身被const 修饰,编译器要求他在定义是必须被初始化,并且这个值在该指针的生命周期内不能被改变,然而可以改变它所指向的对象的值”


int value = 1 ;
int * const pInt = &value ;
*pInt = 2 ;

这样的操作是允许的,但如果想改变指针pInt所指向的对象,那么编译器就会毫不犹豫的帮你指出错误。

int value1 = 1 ;
int value2 = 2 ;
int * const pInt = &value1 ; //safe
pInt = &value2 ; //Error,const指针一旦初始化,就不能再改变所指向的对象


const 指针与指向const 对象的指针在定义时的区别有2点:
①const 指针必须在定义点就完成初始化;而指向const 对象的指针可以先声明,再定义。
②const 指针在定义时,const 必须写在 * 的右边;而指向const 的指针在定义时,const 必须写在 * 的左边。
这样就可以 通过上述的方法来区分二者,const 在 * 左边的是指向const 对象的指针;而在 * 右边的是const 指针。
③指向const 对象的const 指针
在理解了指向const 对象的指针和const 指针之后,相信理解指向const 对象的const 指针就会轻松许多,它的意思就是不论指针本身还是指针值所指向的对象,都被const 修饰,两者均不能更改。
显而易见,指向const 对象的const 指针有两种定义方式:
int const * const pInt ;
const int * const pInt ;
这两种形式都可以达到效果,格式就是在 * 的左右两侧都要有一个const 来修饰。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值