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 来修饰。
C++中的const用法【01】----常量与指针
最新推荐文章于 2024-04-16 00:37:29 发布