手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

高质量C /C编程指南 -- 第5章 常量

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
第5章 常量
常量是一种标识符,他的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。C 语言除了 #define外还能够用const来定义常量(称为const常量)。

5.1 为什么需要常量
假如不使用常量,直接在程式中填写数字或字符串,将会有什么麻烦?

(1) 程式的可读性(可理解性)变差。程式员自己会忘记那些数字或字符串是什么意思,用户则更加不知他们从何处来、表示什么。

(2) 在程式的很多地方输入同样的数字或字符串,难保不发生书写错误。

(3) 假如要修改数字或字符串,则会在很多地方改变,既麻烦又容易出错。

l 【规则5-1-1】 尽量使用含义直观的常量来表示那些将在程式中多次出现的数字或字符串。

例如:

#define MAX 100 /* C语言的宏常量 */

const int MAX = 100; // C 语言的const常量

const float PI = 3.14159; // C 语言的const常量

5.2 const 和 #define的比较
C 语言能够用const来定义常量,也能够用 #define来定义常量。但是前者比后者有更多的长处:

(1) const常量有数据类型,而宏常量没有数据类型。编译器能够对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。

(2) 有些集成化的调试工具能够对const常量进行调试,但是不能对宏常量进行调试。

l 【规则5-2-1】在C 程式中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

5.3 常量定义规则
l 【规则5-3-1】需要对外公开的常量放在头文档中,无需对外公开的常量放在定义文档的头部。为便于管理,能够把不同模块的常量集中存放在一个公共的头文档中。

l 【规则5-3-2】假如某一常量和其他常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。

例如:

const float RADIUS = 100;

const float DIAMETER = RADIUS * 2;

5.4 类中的常量
有时我们希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类能够创建多个对象,不同的对象其const数据成员的值能够不同。

不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。

class A

{…

const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员

int array[SIZE]; // 错误,未知的SIZE

};

const数据成员的初始化只能在类构造函数的初始化表中进行,例如

class A

{…

A(int size); // 构造函数

const int SIZE ;

};

A::A(int size) : SIZE(size) // 构造函数的初始化表

{

}

A a(100); // 对象 a 的SIZE值为100

A b(200); // 对象 b 的SIZE值为200

怎样才能建立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如

class A

{…

enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量

int array1[SIZE1];

int array2[SIZE2];

};

枚举常量不会占用对象的存储空间,他们在编译时被全部求值。枚举常量的缺点是:他的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS