C语言中const的用法(9页).doc
《C语言中const的用法(9页).doc》由会员分享,可在线阅读,更多相关《C语言中const的用法(9页).doc(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-C语言中const的用法-第 9 页(1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值.详细内容: 1、什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:) 2、为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。 3、cons有什么主要的作用? (1)可以定义const常量,具有不可变性。 例如: const int Max=100; int ArrayMax; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除
2、了一些隐患。例如: void f(const int i) . 编译器就会知道i是一个常量,不允许修改; (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可! (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 例如: void f(const int i) i=10;/error! (5) 为函数重载提供了一个参考。 class A . void f(int i)
3、. /一个函数 void f(int i) const . /上一个函数的重载 . ; (6) 可以节省空间,避免不必要的内存分配。 例如: #define PI 3.14159 /常量宏 const doulbe Pi=3.14159; /此时并未将Pi放入ROM中 . double i=Pi; /此时为Pi分配内存,以后不再分配! double I=PI; /编译期间进行宏替换,分配内存 double j=Pi; /没有内存分配 double J=PI; /再进行宏替换,又一次分配内存! const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数
4、,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。 (7) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。 4、如何使用const? (1)修饰一般常量 一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。 例如: int const x=2; 或 const int x=2; (2)修饰常数组 定义或说明一个常数组可采用如下格式: int const a5=1, 2
5、, 3, 4, 5; const int a5=1, 2, 3, 4, 5; (3)修饰常对象 常对象是指对象常量,定义格式如下: class A; const A a; A const a; 定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符const可以放在类名后面,也可以放在类名前面。 (4)修饰常指针 const int *A; /const修饰指向的对象,A可变,A指向的对象不可变 int const *A; /const修饰指向的对象,A可变,A指向的对象不可变 int *const A; /const修饰指针A, A不可变,A指向的对象可变 const int *co
6、nst A;/指针A和A指向的对象都不可变 (5)修饰常引用 使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下: const double & v; (6)修饰函数的常参数 const修饰符也可以修饰函数的传递参数,格式如下: void Fun(const int Var); 告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无意的或错误的修改。 (7)修饰函数的返回值: const修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如下: const int Fun1(); const MyClass Fun2(); (8)修
7、饰类的成员函数: const修饰符也可以修饰类的成员函数,格式如下: class ClassName public: int Fun() const; . ; 这样,在调用函数Fun时就不能修改类里面的数据 (9)在另一连接文件中引用const常量 extern const int i;/正确的引用 extern const int j=10;/错误!常量不可以被再次赋值 另外,还要注意,常量必须初始化! 例如: const int i=5; 5、几点值得讨论的地方: (1)const究竟意味着什么? 说了这么多,你认为const意味着什么?一种修饰符?接口抽象?一种新类型? 也许都是,在St
8、roustup最初引入这个关键字时,只是为对象放入ROM做出了一种可能,对于const对象,C+既允许对其进行静态初始化,也允许对他进行动态初始化。理想的const对象应该在其构造函数完成之前都是可写的,在析够函数执行开始后也都是可写的,换句话说,const对象具有从构造函数完成到析够函数执行之前的不变性,如果违反了这条规则,结果都是未定义的!虽然我们把const放入ROM中,但这并不能够保证const的任何形式的堕落,我们后面会给出具体的办法。无论const对象被放入ROM中,还是通过存储保护机制加以保护,都只能保证,对于用户而言这个对象没有改变。换句话说,废料收集器(我们以后会详细讨论,这
9、就一笔带过)或数据库系统对一个const的修改怎没有任何问题。 (2)位元const V.S. 抽象const? 对于关键字const的解释有好几种方式,最常见的就是位元const 和 抽象const。下面我们看一个例子: class A public: . A f(const A& a); . ; 如果采用抽象const进行解释,那就是f函数不会去改变所引用对象的抽象值,如果采用位元const进行解释,那就成了f函数不会去改变所引用对象的任何位元。 我们可以看到位元解释正是c+对const问题的定义,const成员函数不被允许修改它所在对象的任何一个数据成员。 为什么这样呢?因为使用位元co
10、nst有2个好处: 最大的好处是可以很容易地检测到违反位元const规定的事件:编译器只用去寻找有没有对数据成员的赋值就可以了。另外,如果我们采用了位元const,那么,对于一些比较简单的const对象,我们就可以把它安全的放入ROM中,对于一些程序而言,这无疑是一个很重要的优化方式。(关于优化处理,我们到时候专门进行讨论) 当然,位元const也有缺点,要不然,抽象const也就没有产生的必要了。 首先,位元const的抽象性比抽象const的级别更低!实际上,大家都知道,一个库接口的抽象性级别越低,使用这个库就越困难。 其次,使用位元const的库接口会暴露库的一些实现细节,而这往往会带来
11、一些负面效应。所以,在库接口和程序实现细节上,我们都应该采用抽象const。 有时,我们可能希望对const做出一些其它的解释,那么,就要注意了,目前,大多数对const的解释都是类型不安全的,这里我们就不举例子了,你可以自己考虑一下,总之,我们尽量避免对const的重新解释。 (3)放在类内部的常量有什么限制? 看看下面这个例子: class A private: const int c3 = 7; / ? static int c4 = 7; / ? static const float c5 = 7; / ? . ; 你认为上面的3句对吗?呵呵,都不对!使用这种类内部的初始化语法的时候,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 const 用法
限制150内