让人头晕的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[]函数的返回值。

 

头晕,头痛怎么办?我有好方法,你敢试吗?

头疼的原因非常多,感冒发热、五官有毛病、血压异常、头部有障碍、贫血、便秘、煤气中毒、酒精中毒、神经疲劳等都会引起头疼。 头疼可能是脑膜受到了刺激,血管收缩使张力增加引起的,也可能是脑部提醒我们氧气...
  • u014214610
  • u014214610
  • 2014年03月19日 14:43
  • 128

const,static,全局变量细节及其区别

const: 限制符号,限制某个变量所指向的内容不能通过这个对象修改。 但是可以通过其他的修改,比如: int main(){ int x=5; const int &y=x; x+...
  • u014403897
  • u014403897
  • 2015年05月22日 15:33
  • 2272

C++:const和引用

上面一篇博客我们已经介绍了基本的const,对于这篇博客,我先说下引用是什么 引用说白了就是为对象另外起了一个名字,引用类型引用另一种类型。 定义方式: 将声明符写成&d的形式来定义引用类型其中d是声...
  • lishuzhai
  • lishuzhai
  • 2016年01月28日 18:24
  • 2065

const的用法及其重要性

const的引入其实就是告诉编译器和其它程序员(外部引用者更为合适),该值(变量)应该保持不变。  1、const对象的定义 ·  const int sunNumer = 10;//常量定义及初始化...
  • zhangfuliang123
  • zhangfuliang123
  • 2016年09月11日 16:12
  • 668

C语言中const关键字的用法

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理...
  • xingjiarong
  • xingjiarong
  • 2015年08月09日 09:13
  • 13447

引用和const引用

续前面的http://blog.csdn.net/hjj414/article/details/17390593
  • u013184096
  • u013184096
  • 2014年06月27日 16:05
  • 1420

总结const的用法

1. const的用法: (1)定义常量 (2)修饰函数的参数 (3)修饰函数的返回值 (4)修饰函数的定义体 2. 用const 修饰函数的参数 (1)const 只能修饰输入参数 如果输入...
  • htyurencaotang
  • htyurencaotang
  • 2013年07月08日 23:30
  • 10910

C++的顶层const和底层const的理解

最近,又一次翻开C++primer,决定仔细研究一下自己以前没搞懂的顶层const和底层const。...
  • qq_19528953
  • qq_19528953
  • 2016年03月18日 12:40
  • 3967

const在C语言中的用法详解

const在C语言中的用法详解此文转自网络,虽然不知出自何处,但无论您是谁,老谢表示感恩分享。const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutab...
  • itxiebo
  • itxiebo
  • 2016年04月21日 11:01
  • 5614

const的具体含义

我只要一听到被面试者说:"const意味着常数"(不是常数,可以是变量,只是你不能修改它),我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因...
  • sinat_23662173
  • sinat_23662173
  • 2016年05月13日 17:40
  • 548
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让人头晕的const
举报原因:
原因补充:

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