C++中const的使用

转载 2015年11月18日 20:41:01

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。

const的使用是c语言中一个比较微妙的地方,请看下面几个问题。

 

问题:const变量 和 常量

  为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? 

  const int n = 5;

int a[n];

答案与分析:

1)这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。

C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。

  2) 注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。

3) 那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型#define宏,这两个都可以用来定义常量。

 

问题:const变量 和 const 限定的内容

  下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢? 

  typedef char * pStr;

  char string[4] = "abc";

  const char *p1 = string;

  const pStr p2 = string;

  p1++;

  p2++;

  答案与分析:

  问题出在p2++上。

  1) const使用的基本形式: const char m;

  限定m不可变。

  2) 替换1式中的m, const char *pm;

  限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。

  3) 替换1式char, const newType m;

  限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。

问题:const变量 和 字符串常量

  请问下面的代码有什么问题?

  char *p = "i'm hungry!";

  p[0]= 'I';

  答案与分析:

  上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。

 

问题:const变量 和 字符串常量2

  请问char a[3] = "abc" 合法吗?使用它有什么隐患?

  答案与分析:

在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为“abc”,但它没有通常的字符串终止符'\0',因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。

 

问题5:const 和 指针

类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?

1) const在前面

  const int nValue; //nValue是const

  const char *pContent; //*pContent是const, pContent可变

  const (char *) pContent; //pContent是const,*pContent可变

  char* const pContent; //pContent是const,*pContent可变

const char* const pContent; //pContent和*pContent都是const

 

2) const在后面,与上面的声明对等

  int const nValue; // nValue是const

  char const * pContent;// *pContent是const, pContent可变

  (char *) const pContent;//pContent是const, *pContent可变

  char* const pContent;// pContent是const, *pContent可变

char const* const pContent;// pContent和*pContent都是const

 

答案与分析:

const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面介绍一种有效的判断原则:

 

A、  当有“()”的出现时,比如

const (char *) pContent;

 

此时,(char *)是一个整体,相当于一个新类型,因此,这时限定指针为const。

 

B、其它情况时

l          沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针所指的为常量

l          如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

C/C++——const用法完整总结

C/C++——const用法完整总结
  • Linux_ever
  • Linux_ever
  • 2016年05月08日 10:49
  • 1657

c++中const的用法和注意事项

1、const修饰成员变量: 在c++中在定义常量是通常会用到的const,但是对于const的位置不同通常是表示不同的作用,而且之间的相互作用通常会造成混淆,下面作简要注解:     1)、直接修饰...
  • m0_37338590
  • m0_37338590
  • 2017年03月10日 11:34
  • 542

C++中”const“关键字使用详解

关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,现将本人的一些体会总结如下,期望对大家有所帮助:一 const基础    如果const关键字不涉及到指针,我们很...
  • ArduousBonze
  • ArduousBonze
  • 2007年05月15日 13:43
  • 2395

C++关于类成员函数在参数列表后加const的作用,以及使用条件

C++关于类成员函数在参数列表后加const的作用,以及使用条件
  • u014452891
  • u014452891
  • 2017年07月25日 17:06
  • 414

关于C++中的Const常量

一. 为什么需要常量  (1)如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦: 1. 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意 思,用户则更加不知它们...
  • wojiaowugen
  • wojiaowugen
  • 2014年07月20日 10:13
  • 937

C++中const和static关键字的作用总结

static和const关键字的作用可以从两个方面回答:一是和类的成员函数或者成员变量相关,二是不属于类的函数或者变量。 static关键字的作用: 1、函数体内static变量的作用范围为该函数体,...
  • u010182186
  • u010182186
  • 2016年09月26日 17:05
  • 1024

C++函数中const形参与非const形参

关于C++函数中形参、实参const问题,比较绕,在此特意总结归纳一下: 先看一个例子: void swap1( int *x, int *y){ int temp=*x; *x=*y; ...
  • ziyanguang1989
  • ziyanguang1989
  • 2013年11月14日 17:09
  • 1141

C++ 笔记_类的成员函数以及const的作用

类内部,声明成员函数是必须的,而定义成员函数则是可选的,在类内部定义的函数默认为inline。在类外部定义的成员函数必须指明他们是在类的作用域中,将关键字const添加到函数形参后面,就可以将成员函数...
  • wsr123wsrwsr
  • wsr123wsrwsr
  • 2016年11月02日 22:18
  • 359

C++类const成员变量初始化

class CExample { public: CExample():m_a(1),m_b(2){/*m_a = 1; compile error*/} CExample(const CExam...
  • junlon2006
  • junlon2006
  • 2016年11月08日 16:37
  • 1599

C++回顾之const对象、const成员函数、mutable类型

总结const的各种用法,主要讲述const对象,及const 成员函数,还有mutable修饰的数据成员...
  • ab198604
  • ab198604
  • 2014年02月08日 11:02
  • 3495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中const的使用
举报原因:
原因补充:

(最多只允许输入30个字)