C++基础学习笔记——Const修饰符

const 修饰符

在C中,习惯使用 #define来定义常量,例如:

#define LIMIT 100 ;

C++提供了一种更灵活、更安全的方式来定义常量, 即使用 const 修饰符来定义常量,例如:

const int LIMIT = 100

这个常量是类型化的,它有地址,可以用指针指向这个值,但不能修改它。 const 也可以与指针一起使用,它们的组合情况较复杂,可归纳为三种:指向常量的指针、常指针和指向常量的常指针
(1)指向常量的指针是指一个指向常量的指针变量, 例如:

 const char * name = "chen"; // 声明指向常量的指针 

这个语句的含义为: 声明一个名为 name 的指针变量, 它指向一个字符型常量, 初始化 name 为指向字符串”chen”。
由于使用了 const ,不允许改变指针所指的常量,因此以下语句是错误的:

 name[ 3] = 'a'; 

但是,由于 name 是一个指向常量的普通指针变量,不是常指针,因此可以改变 name 的 值。例如下列语句是允许的:

   name = "zhang"; 

该语句赋给了指针另一个常量,即改变了 name 的值。
(2)常指针是指指针本身, 而不是它指向的对象声明为常量,例如:

char * const name = "chen"; // 常指针 

这个语句的含义为:声明一个名为 name 的指针变量,该指针是指向字符型数据的常指针,用”chen”的地址初始化该常指针。
创建一个常指针,就是创建一个不能移动的固定指针,但是它所指的数据可以改变,例如:

name[ 3] = 'a'; 	// 合法name = "zhang"; 	// 出错 

第一个语句改变了常指针所指的数据,这是允许的,但第二个语句要改变指针本身,这是不允许的。

(3) 指向常量的常指针是指这个指针本身不能改变,它所指向的值也不能改变。要 声明一个指向常量的常指针,二者都要声明为 const,例如:

const char * const name = "chen"; // 指向常量的常指针

这个语句的含义是:声明了一个名为 name 的指针变量,它是一个指向字符型常量的常指 针,用“chen”的地址初始化该指针。不难理解以下二个语句都是错误的:

 name[ 3] ='a';   //出错,不能改变指针所指的值 name = "zhang"; // 出错,不能改变指针本身

说明
(1)如果用 const 定义的是一个整型常量,关键字 int 可以省略。所以下面的两行定 义是等价的:

const int LIMIT = 100;
const LIMIT = 100; 

(2)常量一旦被建立,在程序的任何地方都不能再更改。

(3) 与 # define 定义的常量有所不同,const 定义的常量可以有自己的数据类型,这样C++的编译程序可以进行更加严格的类型检查,具有良好的编译时的检测性。

(4)const 的作用与 # define 相似,但它消除了 # define 的不安全性,因此建议用const 取代 # define 定义常量。

下例说明了使用 # define 的不安全性。

# include < iostream .h >int main ( ) {int a = 1;# define T1 a + a; # define T2 T1 - T1 ;cout < < "T2 is"< < T2 < < endl; return 0; }

初看程序,似乎应打印出:
T2 is 0
但是这个答案是错误的,程序的实际输出结果是:
T2 is 2
其原因是 C++把第 7 行语句解释成:

cout < < "T2 is"< < a + a - a + a < < endl;

如果程序中用 const 取代了两个 # define,将不会引起这个错误,请看下例。

# include < iostream .h > 
int main ( ) 
{ int a = 1; const T1 = a + a ;const T2 = T1 - T1; cout < < "T2 is"< < T2 < < endl;return 0;
}

输出:
T2 is 0

(5 ) 函数参数也可以用 const 说明, 用于保证实参在该函数内部不被改动,大多数C++编辑器能对具有 const 参数的函数进行更好的代码优化。

(6 ) 虽然美国国家标准化协会 (ANSI) 制定的 C 标准 ( 简称 ANSI C 标准 ) 也采用了 const ,但两者略有差别,如下面的程序段在C++中是合法的,但却不能被 ANSIC 所 接受:

const int size = 300;
int a[size] ;

另外,在 ANSIC 标准中,const 定义的常量是全局常量,而 C++中 const 定义的常量根据其定义的位置来决定其是局部的还是全局的。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部