const限定修饰符:
下面的循环有两个问题,都是由于使用512作为循环上限引起的:
for( int index =0; index < 512; ++index)
第一个问题是可读性。用512来测试index是什么意思呢?循环再做什么呢?----即512是什么意思?[在本例中,512被称作魔数(magic
number),他的重要性在上下文中没有体现出来,就好像这个数是凭空出现的。]
第二个问题是可维护性。想象程序有10000行,512在4%的代码中出现。在这400个出现中,80%必须要被改成1024。为了做到这一点,我们
必须明白哪些512时要被转换的,而哪些不是.即使之有一个地方弄错了,也会中断程序,要我们回头全部重新检查一遍。
这两个问题的解决方案就是使用一个被初始化为512的对象。通过选择一个助记名,可能是bufSize,使程序更具可读性。现在,条件测试
变成与对象作比较,而不是与一个文字常量作比较:
index < bufSize
我们不需要再把320个出现512的地方一一找出来,只需改变bufSize的值就行了。我们只需改变bufSize被初始化的那一行。这种方法不仅只
需要很少的工作量,而且大大减少了出错的可能性。这种方案的代价是一个额外的变量。现在512被称为是局部化的(localized)。
为了减少错误改变bufSize的值,把它定义为右值形式,即常量。
const标识符,
1、因为常量定义后就不能被修改,所以他必须被初始化。
2、如果允许非const对象的指针指向一个常量对象,把“试图通过该指针间接的改变对象值”的动作标记为非法的,对编译起来说是不可行的。因而任何“试图将一个非const对象的指针指向一个常量对象”的动作都将引起编译错误。必须声明一个指向常量的指针。指向常量的指针本身不是常量,可以重新赋值,指向不同的常量对象,但是不能修改它所指向的对象.(经过调试,指向常量的指针也可以不指向常量,但是无法同过指向常量的指针来修改这个变量的内容,报错:error C2166: l-value specifies const object.但可以直接修改变量的).常量对象地址只能赋给指向常量的指针,否则error C2440: '=' : cannot convert from 'const int *' to 'int *'
Conversion loses qualifiers
3.const指针,常量指针,可以是指向非常量的常量指针,也可以是指向常量的常量指针.
const double pi=3.14;
double p;
double *const p_ptr=&p;//指向非常量的常量指针,指针本身不能被修改,但指向的内容可以修改.
const double *const pi_ptr=π//指向常量的常量指针;
// pointer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream.h>
#include <cstring>
int main(int argc, char* argv[])
{
int a=5;
int *pa=&a;
int **ppa=&pa;
int ***pppa=&ppa;
const int c=6;
const int *pc;
// pa=&a; //error C2440: '=' : cannot convert from 'const int *' to 'int *' Conversion loses qualifiers
pc=&c;
pc=&a;
a=6;
// *pc=6;
cout<<"a="<<a<<'/n';
cout<<"pa="<<pa<<'/n'<<"*pa="<<*pa<<'/n';
cout<<"ppa="<<ppa<<'/n'<<"*ppa="<<*ppa<<'/n'<<"**ppa="<<**ppa<<'/n';
cout<<"pppa="<<pppa<<'/n'<<"*ppa="<<*pppa<<'/n'<<"**pppa="<<**pppa<<'/n'<<"***pppa="<<***pppa<<'/n';
return 0;
}