昨天发布了3-7今天我们来8-13课程在一步一步向后走了,也意味着视频就快结束了,不过不要紧,还有100多课,哈哈,先让大家安心安心,东西要慢慢学,所谓慢火出老汤。
课程目录:
C++ Primer培训视频第八课:限定符
C++ Primer培训视频第九课:typedef 预定义
C++ Primer培训视频第十课:名字的作用域
C++ Primer培训视频第十一课:声明和定义
C++ Primer培训视频第十二课:引用
希望大家HOLD住了,好了回归正题这次课程的内容如下:
3.5 const 限定修饰符
下面的循环有两个问题都是由于使用 512 作为循环上限引起的
for ( int index = 0; index < 512; ++index )
第一个问题是可读性用 512 来测试 index 是什么意思呢循环在做什么呢——即 512是什么意思在本例中512 被称作魔数magic number它的重要性在上下文中没有体现出来就好像这个是凭空出现的第二个问题是可维护性想像程序有 10000 行512 在 4的代码中出现在这 400 个出现中80必须要被改成 1024为了做到这一点我们必须明白哪些 512 是要被转换的而哪些不是
即使只有一个地方弄错了也会中断程序要我们回头全部重新检查一遍这两个问题的解决方案就是使用一个被初始化为 512 的对象通过选择一个助记名可能是 bufSize使程序更具可读性现在条件测试变成与对象作比较而不是与一个文字常量作比较
ndex < bufSize
我们不需要再把 320 个出现 512 的地方——找出来只需改变 bufSize 的值就行了我们只需改变 bufSize 被初始化的那一行这种方法不仅只需要很少的工作量而且大大减少了出错的可能性 这种方案的代价是一个额外的变量 现在 512 被称为是局部化的 localized
int bufSize = 512; // 缓冲区大小
// ...
for ( int index = 0; index < bufSize; ++index )
// ...
这种方案的问题是
bufSize 是一个左值在程序中 bufSize 有可能被偶然修改
例如
下面是一个常见的程序错误
// 偶然地改变了 bufSize 的值
if ( bufSize = 1 )
// ...
在 C++中
=
是赋值操作符
而
==
是等于操作符程序员不小心将 bufSize 的值改成 1将导致了一个很难跟踪的错误这种错误很难被发现因为程序员一般不会认为这行代码是错的这就是为什么许多编译器会对此类的赋值达式生成警告的原因const 类型限定修饰符提供了一个解决方案它把一个对象转换成一个常量84 第三章 C++数据类型
例如
const int bufSize = 512 // 缓冲区大小
定义 bufSize 是一个常量并将其初始化为 512在程序中任何改变这个值的企图都将导致编译错误因此它被称为是只读的read- only
例如
// 错误
企图写入 const 对象
if ( bufsize = 0 ) ...
因为常量在定义后就不能被修改所以它必须被初始化未初始化的常量定义将导致编译错误const double pi; // 错误: 未初始化的常量一旦一个常量被定义了我们就不能改变与 const 对象相关联的值另一方面我们能把它的地址赋值给一个指针吗例如下面代码是否可行
const double minWage = 9.60;
// ok? error?
double *ptr = &minWage;
这是否可行呢minWage 是一个常量对象因此它不能被改写为一个新的值但是 ptr是一个普通指针没有什么能阻止我们写出这样的代码*ptr += 1.40; // 修改了 minwage!
一般编译器不能跟踪指针在程序中任意一点指向的对象这种内部工作需要进行数据流分析data flow analysis通常由单独的优化器optimizer组件来完成允许非 const对象的指针指向一个常量对象把试图通过该指针间接地改变对象值的动作标记为非法的这对编译器来说是不可行的因而任何试图将一个非 const 对象的指针指向一个常量对象的动作都将引起编译错误这并不意味着我们不能间接地指向一个 const 对象只意味着我们必须声明一个指向常量的指针来做这件事
例如
const double *cptr;
cptr 是一个指向 double 类型的 const 对象的指针我们可以从右往左把这个定义读为cptr 是一个指向 double 类型的被定义成 const 的对象的指针此中微妙在于 cptr 本身不是常量我们可以重新赋值 cptr使其指向不同的对象但不能修改 cptr 指向的对象
例如
const double *pc = 0;
const double minWage = 9.60;
// ok: 不能通过 pc 修改 minWage
pc = &minWage;
double dval = 3.14;
// ok: 不能通过 pc 修改 dval
// 虽然 dval 本身不是一个常量
pc = &dval; // ok
85 第三章 C++数据类型
dval = 3.14159;
// ok
*pc = 3.14159;
// 错误
const 对象的地址只能赋值给指向 const 对象的指针例如 pc但是指向 const 对象的指针可以被赋以一个非 const 对象的地址例如
pc = &dval;
虽然 dval 不是常量但试图通过 pc 修改它的值仍会导致编译错误因为在运行程序的任意一点上编译器不能确定指针所指的实际对象在实际的程序中指向 const 的指针常被用作函数的形式参数
它作为一个约定来保证被传递给函数的实际对象在函数中不会被修改
例如
// 在实际的程序中, 指向常量的指针
// 往往被用作函数参数
int strcmp( const char *str1, const char *str2 );
下载地址本帖隐藏的内容:
C++ Primer培训视频8-13_尼玛资源技术论坛_wWw.LtHack.Com(178.40M)
|
|