当前位置:首页>网络学院>程序开发>Visual C++教程>文章内容

c++中关于const的理解和思考

[ 来源:http://www.it55.com | 作者: | 时间:2007-09-11 | 收藏 | 推荐 ] 【

以下是我对Const的理解,仅供参考。先来说说Const的作用:

http://www.it55.com

1.   const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令

精美韩国模版下载http://www.it55.com

2.   可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

3.   编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。 免费网页模版下载http://www.it55.com

4.    可以节省空间,避免不必要的内存分配。 免费矢量图片素材下载http://www.it55.com

  例如:

精美商业网页模版下载http://www.it55.com

     #define PI 3.14159         file://常量宏

免费网页模版下载http://www.it55.com

     const doulbe  Pi=3.14159;  file://此时并未将Pi放入ROM中 http://www.it55.com

        ...... http://www.it55.com

     double i=Pi;             file://此时为Pi分配内存,以后不再分配!

http://www.it55.com/

     double I=PI;               file://编译期间进行宏替换,分配内存

IT资讯之家 http://www.it55.com

     double j=Pi;               file://没有内存分配

免费网页模版下载http://www.it55.com

     double J=PI;               file://再进行宏替换,又一次分配内存!

sflj http://www.it55.com kg^&fgd

 const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。 免费网页模版下载http://www.it55.com

 

免费网页模版下载http://www.it55.com

对于基本声明

精美韩国模版下载http://www.it55.com

1.  const int r=100; //标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换 免费网页模版下载http://www.it55.com

 

http://www.it55.com在线教程

2.  extend const int r=100; //将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义 http://www.it55.com

但是如果外部想链接r,不能这样用

IT资讯之家 http://www.it55.com

extern const int r=10;  //错误!常量不可以被再次赋值 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

3. const int r[ ]={1,2,3,4};

45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

struct S {int a,b;};

免费矢量图片素材下载http://www.it55.com

const S s[ ]={(1,2),(3.4)}; //以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中的值,例如:int temp[r[2]];这样的编译器会报告不能找到常量表达式 it55.com

 但是

免费资源http://www.it55.com

 const int Max=100; sflj http://www.it55.com kg^&fgd

 int Array[Max]; 

it55.com

正确。 vd;k;l http://www.it55.com rdfg

 定义数组必须用常量,可以用const或者#define定义。 Static 虽然是编译时确定,也不能用来声明数组。 免费网页模版下载http://www.it55.com

 

IT资讯之家 http://www.it55.com

对于指针和引用 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

1.   const int *r=&x; //声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量 IT资讯之家 http://www.it55.com

pointer const 可以指定普通变量,用改指针不能修改它指向的对象,并不表示指向的对象是const不能被改变,例如:

it55.com

int i = 10; 免费网页模版下载http://www.it55.com

const int * p =  &i; 精美韩国模版下载http://www.it55.com

*p = 11; //wrong 精美韩国模版下载http://www.it55.com

  精美商业网页模版下载http://www.it55.com

 i = 11 ; //correct

http://www.it55.com

自己的一个经验:一个具体的概念可以用范型的概念来赋值,但是一个范型的概念不能用具体的概念来赋值。 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

我们可以把const指针当成普通指针的父类,因为普通指针改写了const属性,而具有比const指针更多的功能。 这样的话只有父类指针可以指向子类,而子类指针不能指向父类。

http://www.it55.com

2.   int const *r=&x; //与用法1完全等价,没有任何区别

精美商业网页模版下载http://www.it55.com

3.   int * const r=&x; //声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改

http://www.it55.com在线教程

4.  const int * const r=&x; //综合1、3用法,r是一个指向常量的常量型指针

vd;k;l http://www.it55.com rdfg

5.   const double & v;      该引用所引用的对象不能被更新

免费矢量图片素材下载http://www.it55.com

 引用必须定义是初始话,而且初始化后这个引用不能指向其他的对象。但是这里加的const声明不是这个意思,它是指不能改变v引用对象本身,也就是只能调用该对象里面的const成员函数。

sflj http://www.it55.com kg^&fgd

  免费设计素材下载http://www.it55.com

对于类型检查 IT资讯之家 http://www.it55.com

可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值;但是不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合法化写法,使用类型强制转换可以通过指针改变const对象:

免费设计素材下载http://www.it55.com

const int r=100; 免费网页模版下载http://www.it55.com

int * ptr = const_cast<int*>(&r);  //C++标准,C语言使用:int * ptr =(int*)&r;

精美韩国模版下载http://www.it55.com

 

免费网页模版下载http://www.it55.com

对于字符数组 免费资源http://www.it55.com

  免费矢量图片素材下载http://www.it55.com

如char * name = “china”; 这样的语句,在编译时是能够通过的,但是”china”是常量字符数组,任何想修改他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要使用char name[ ] = “china”; 这种形式。 免费设计素材下载http://www.it55.com

  vd;k;l http://www.it55.com rdfg

对于函数

http://www.it55.com

1. void Fuction1 ( const int r ); //此处为参数传递const值,意义是变量初值不能被函数改变 免费网页模版下载http://www.it55.com

2. const int Fuction1 (int); //此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要的,见下面条款3。

免费矢量图片素材下载http://www.it55.com

3.  Class CX; //内部有构造函数,声明如CX(int r =0)

(编辑:IT资讯之家 www.it55.com

返回顶部
共3页: 上一页 1 [2] [3] 下一页  

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]