当前位置: 首页 > 图文教程 > 开发语言 > VC++ > const传奇

VC++
关于win32 programming中的视口和窗口!
VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法
个人VC串口通信经验及相关知识总结
VC++ 内存机理的个人理解:堆和栈
理解VC++里字符串类型的真正含义
VC++ 实现全屏
VC++ 6.0的小花招
VC++快捷键
VC中的一些调试技巧
由MessageBox透视Win API的调用
VC-文本框只能输入数字和小数 源文件
C 基础:C 类成员属性的一种简洁实现
vc中bool与BOOL的区别
C++和Java的区别
VC++6.0 下搭建 wxWidgets 开发环境
VC6做简易自动升级程序
VC++ 6.0的小花招
VC++程序调试
VC++ 捕捉摄像头视频
VC++的Unicode编程

VC++ 中的 const传奇


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 46 ::
收藏到网摘: n/a

const传奇
原作:Rahul Singh 翻译:zhigang

[译者注]有些地方按原文解释不通,译者根据自己的理解作了适当修改。如有不妥之处,请告知[email protected]或参考原文。
原文来自www.codeproject.com

简介
当我自己写程序需要用到const的时候,或者是读别人的代码碰到const的时候,我常常会停下来想一会儿。许多程序员从来不用const,理由是即使没用const他们也这么过来了。本文仅对const的用法稍作探讨,希望能够对提高软件的源代码质量有所帮助。

常变量
变量用const修饰,其值不得被改变。任何改变此变量的代码都会产生编译错误。Const加在数据类型前后均可。
例如

void main(void){ const int i = 10; //i,j都用作常变量 int const j = 20; i = 15; //错误,常变量不能改变 j = 25; //错误,常变量不能改变}
常指针
Const跟指针一起使用的时候有两种方法。

const可用来限制指针不可变。也就是说指针指向的内存地址不可变,但可以随意改变该地址指向的内存的内容。

void main(void){ char* const str = "Hello, World"; //常指针,指向字符串 *str = ''M''; //可以改变字符串内容 str = "Bye, World"; //错误,如能改变常指针指向的内存地址}
const也可用来限制指针指向的内存不可变,但指针指向的内存地址可变。
void main(void){ const char* str = "Hello, World"; //指针,指向字符串常量 *str = ''M''; //错误,不能改变字符串内容 str = "Bye, World"; //修改指针使其指向另一个字符串 *str = ''M''; //错误,仍不能改变字符串内容}
看完上面的两个例子,是不是糊涂了?告诉你一个诀窍,在第一个例子中,const用来修饰指针str,str不可变(也就是指向字符的常指针);第二个例子中,const用来修饰char*,字符串char*不可变(也就是指向字符串常量的指针)。

这两种方式可以组合起来使用,使指针和内存内容都不可变。

void main(void){ const char* const str = "Hello, World"; //指向字符串常量的常指针 *str = ''M''; //错误,不能改变字符串内容 str = "Bye, World"; //错误,不能改变指针指向的地址}
Const和引用
引用实际上就是变量的别名,这里有几条规则:
声明变量时必须初始化
一经初始化,引用不能在指向其它变量。
任何对引用的改变都将改变原变量。
引用和变量本身指向同一内存地址。

下面的例子演示了以上的规则:

void main(void){ int i = 10; //i和j是int型变量 int j = 20; int &r = i; //r 是变量i的引用 int &s; //错误,声明引用时必须初始化 i = 15; //i 和 r 都等于15 i++; //i 和 r都等于16 r = 18; //i 和r 都等于18 printf("Address of i=%u, Address of r=%u",&i,&r); //内存地址相同 r = j; //i 和 r都等于20,但r不是j的引用 r++; //i 和 r 都等于21, j 仍等于20}
用const修饰引用,使应用不可修改,但这并不耽误引用反映任何对变量的修改。Const加在数据类型前后均可。
例如:
void main(void){ int i = 10; int j = 100; const int &r = i; int const &s = j; r = 20; //错,不能改变内容 s = 50; //错,不能改变内容 i = 15; // i和r 都等于15 j = 25; // j和s 都等于25}
Const和成员函数
声明成员函数时,末尾加const修饰,表示在成员函数内不得改变该对象的任何数据。这种模式常被用来表示对象数据只读的访问模式。例如:
class MyClass{ char *str ="Hello, World"; MyClass() { //void constructor } ~MyClass() { //destructor } char ValueAt(int pos) const //const method is an accessor method { if(pos >= 12) return 0;	*str = ''M''; //错误,不得修改该对象 return str[pos];	//return the value at position pos }}
Const和重载
重载函数的时候也可以使用const,考虑下面的代码:
class MyClass{ char *str ="Hello, World"; MyClass()