让人头晕的const

原创 2006年05月24日 21:23:00

让人头晕的const

看到const关键字,C++程序员首先想到的可能是const常量. 但是实际上并没有这么简单。

1一般常量和对象常量
1.1 一般常量

  一般常量是指简单类型的常量。定义时,修饰符const可以放在常量类型前,也可以放在常量类型后。如:

  int const x=2;
  和
  const int x=2;
是等价的。

  定义或说明一个常数组可采用如下语法:

  <类型说明符> const <数组名>[<大小>]…
  或者
  const <类型说明符> <数组名>[<大小>]…

        例如:
  int const a[5]={1, 2, 3, 4, 5};

1.2常对象
常对象是指对象常量,定义格式如下:

  <类名> const <对象名>
  或者
  const <类名> <对象名>

  定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符const可以放在类名后面,也可以放在类名前面。

2.常指针和常引用
  一般常量和对象常量是很直观的,很容易理解,但是指针相关的const就稍微有点复杂了。
使用const修饰指针时,由于const的位置不同,而含意不同。下面举两个例子,说明它们的区别。
记住一个原则,根据const 相对于 * 的位置,“数据向左,指针向右”
意思是如果const位于*的左边,那么指针指向的数据是常量,否则,指针本身为常量.

  下面定义的一个指向字符串的常量指针:

  char * const ptr1 = string1;
  其中,ptr1是一个常量指针。因此,下面赋值是非法的。
  ptr1 = string2;

  而下面的赋值是合法的:
  *ptr1 = "m";

  因为指针ptr1所指向的变量是可以更新的,不可更新的是常量指针ptr1所指的方向(别的字符串)。

  下面定义了一个指向字符串常量的指针:

  const char * ptr2 = string1;

  其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,

  *ptr2 = "x";
  是非法的,而:
  ptr2 = string2;
  是合法的。

  所以,在使用const修饰指针时,应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时,const修饰符的位置不同,前者const放在*和指针名之间,后者const放在类型说明符前。

3.const 函数

const的一些强大的功能基于它在函数声明中的应用。
在一个函数声明中,const可以指的是函数的返回值,或某个参数;对于成员函数,还可以指的是整个函数。

3.1 常成员函数

  const成员函数的目的当然是为了指明哪个成员函数可以在const对象上被调用。但很多人忽视了这样一个事实:
    仅在const方面有不同的成员函数可以重载。这是c++的一个重要特性。再次看这个string类:

class string {
public:

  ...

  // 用于非const对象的operator[]
  char& operator[](int position)
  { return data[position]; }

  // 用于const对象的operator[]
  const char& operator[](int position) const
  { return data[position]; }

private:
  char *data;
};

string s1 = "hello";
cout << s1[0];                  // 调用非const
                                // string::operator[]
const string s2 = "world";
cout << s2[0];                  // 调用const
                                // string::operator[]

通过重载operator[]并给不同版本不同的返回值,就可以对const和非const string进行不同的处理:

string s = "hello";              // 非const string对象

cout << s[0];                    // 正确——读一个
                                 // 非const string

s[0] = 'x';                      // 正确——写一个
                                 // 非const string

const string cs = "world";       // const string 对象

cout << cs[0];                   // 正确——读一个
                                 // const string

cs[0] = 'x';                     // 错误!——写一个
                                 // const string

另外注意,这里的错误只和调用operator[]的返回值有关;operator[]调用本身没问题。
错误产生的原因在于企图对一个const char&赋值,因为被赋值的对象是const版本的operator[]函数的返回值。

 

相关文章推荐

旋转VR相机不头晕:一个反直觉的发现

旋转VR相机不头晕:一个反直觉的发现目前为止,对所有VR开发者来说一个明确建议:你可以使用传统游戏杆移动VR相机位置,但是任何水平方向上旋转(鼠标视角或摇杆旋转)都会引起玩家不适。 如上所说,我找到...

苹果发布 各种头晕的 证书学习

1, development provisioning profile 开发条款协议  就是一个签名授权的文件。授权一系列的app可以跑,授权一系列的设备可以跑你的app.授权一系列的开发者证书来签...

C语言 让我头晕的值传递与址传递

原文:http://blog.csdn.net/the_fire/article/details/4267058 c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也...

VR系列——Oculus最佳实践:七、虚拟幻境头晕(下)

失真校正Rift的镜头扭曲的显示屏上显示的图形,这是由SDK给出的后期处理步骤校正的。这种扭曲被正确的完成,并根据SDK的准则和所提供的实例演示是极为重要的。不正确的失真可以“看”做相当正确的,但还是...
  • huayuQA
  • huayuQA
  • 2017年03月08日 20:12
  • 333

不再头晕恶心 采用新技术的裸眼3D手机年底面市

韩国移动设备与剧院用3D立体屏幕制造商MasterImage公司在智能手机、平板电脑的裸眼3D屏幕研发上有着多年的经验,他们在今年的CES上展示过一些样品。据The Verge消息,该公司新的裸眼...

头晕头痛的饮食偏方

方法一:鸡蛋红糖治头晕   豆油适量放锅内烧热,将2个鸡蛋、30克红糖(放一点水搅拌)倒入锅内煎熟,空腹服用,连服10天。为巩固疗效,也可多服几天。   方法二:篱栏药膳治头晕 用中草药篱...

找到心脏病人支架后胸闷恶心头晕的治疗方法

你相信吗?有比心脏支架手术效果好十倍不止的方法,心脏支架手术达不到的效果它都达到了,而且它的效果绝对比预料中的还要好。这个疗法叫的德国生物氧化疗法。但有些遗憾我才找到这个疗法。   之所以找到这个...

const用法详细解释

  • 2014年11月04日 09:20
  • 98KB
  • 下载

zepto_const js

  • 2015年12月02日 19:39
  • 8KB
  • 下载

C++_const限定修饰符

常量 ================================== 为了防止程序员因不小心的错误而修改掉某个变量的值,我们可以给这类型的变量加上const限定修饰符。 它把一个对象转换成了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让人头晕的const
举报原因:
原因补充:

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