首页 > 编程 > C++ > 正文

C++ 中 const 详解

2019-11-08 01:45:04
字体:
来源:转载
供稿:网友

一:定义常量

  const关键字指定变量的值是恒定的,以防止程序员修改它,并且在定义一个const变量时必须初始化它,除非你用了extern关键词准备来进行外部链接。

const int i = 5; //right,和 int const i=5; 等价 const int j; //error,未初始化extern const int k; //right,外部链接

二:指针使用const

2.1 指向常量int的指针

int x = 1;const int* p1 = &x;int const* p2; //两种写法表示的都是一个意思*p1 = 10; //error,你不可以通过指针p1改变x值

  注意,const在这里可以不为其初始化。

2.2 指向变量int的常量指针

int x = 1;int* const p1 = &x; //right*p1 = 3; //right,与2.1不同,你可以通过指针p1修改x值int* const p2; //error,与2.1不同,必须初始化int y = 2;p1 = &y; //error,你不可以让p1指向别的地方

2.3 const指针与普通指针的区别

int x = 1;const int* con_p = &x;int* p = con_p; //error

  我们很容易知道第三句代码是错的。也就是不可以把指向常量的指针赋给一个普通的指针,这是为了防止普通指针修改该常量。   那下面的代码呢?

int x = 1;int* const con_p = &x;int* p = con_p; //right

  这句代码是对的。把指向变量的常量指针赋给一个普通指针,注意赋值的是x的地址,这无关常量指针的事,要注意区分。

2.4 总结

  请注意,const是一个左结合的类型修饰符,根据这个特点可以很容易总结如下:   const int* p,指向常量int的指针,即int是常量,指针是变量;   int* const p,指向变量int的常量指针,即int是变量,指针是常量。

三:const修饰的函数

const int fun1() //这个其实无意义,因为参数返回本身就是赋值;const int* fun2() //调用时 const int* pValue = fun2(); int* const fun3() //调用时 int* const pValue = fun2();

四:类中使用const

4.1 类成员变量

  表示类成员常量,不能被修改,同时它只能在初始化列表中赋值。

class Base { PRivate: const int data; //类成员常量public: Base(int x):data(x){} //列表初始化}

4.2 类成员函数

  const修饰类的成员函数,则该成员函数不能修改类成员变量调用类中任何非const成员函数。一般写在函数的最后来修饰。

class Base { private: int data; public: Base(int x):data(x){} void func1() { ; } void func2()const { data = 1; //error } void func3()const { func1(); //error } }

五:因为我们是倔强的C++ Coder

  const修饰的变量不可改变,这是规定,但是在C++指针面前,一切皆有可能。看下面的代码:

#include<iostream>using namespace std;int main(){ const int x = 1; int* p = (int*)&x; *p = 9; cout << x << endl; //1 cout << *P << endl; //9}

  代码很简单,我们利用指针p对常量x进行修改,输出结果*p表明我们确实改变了x。但是存在疑问的是为什么输出x还是1呢?这是因为,编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有存储与读内存的操作,使得它的效率很高。 文章转自我的个人博客:http://www.61mon.com/index.php/archives/167/


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选