2007年5月9日星期三

[ZZ]我对const的总结(整理)

发信人: olddog (汪汪汪), 信区: C++
标 题: 我对const的总结(整理)
发信站: 飘渺水云间 (Thu Jul 4 21:04:12 2002), 转信

1. Const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。
注意一点:const可以避免不必要的内存分配
#define STRING "abcdefghijklmn\n"
const char string[]="abcdefghijklm\n";
...
printf(STRING); //为STRING分配了第一次内存
printf(string); //为string一次分配了内存,以后不再分配
...
printf(STRING); //为STRING分配了第二次内存
printf(string);
...
由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,
而不是象#define一样给出的是立即数,所以,const定义的常量在
程序运行过程中只有一份拷贝,而#define定义的常量在内存中有
若干个拷贝。

另外:const可以限定符声明变量只能被读 ,可以便于进行类型检查 , 必须初始化;


2.const的重要特点:
C++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,同时,这也是它取代预定义语句的重要基础。这是因为编译器不会去读存储的内容,如果编译器为const分配了存储空间,它就不能够成为一个编译期间的常量了。 另外:const会由编译器对它进行类型的检测。其实,最主要记住一点 const是向左结合的!!!

const出现位置(example)
<1>
const int i = 0;
const char * a;
char * const cp;
<2>
const T1 func(T2)
const char * func(T2)
char * const func(T2)
T1 func(T2) const
T1 func(const char *)
T1 func(char * const T2)


意义
<1>
char * const cp ;//const pointer to char
char const * cp; //pointer to const char
const char * pc; //pointer to const char
从右往左读


3.const的应用
a. const指针和指针const: 注意const是左结合的;
b. const限定了函数的传递值(引用)参数;
c. const限定函数的返回值;



4.与类有关的const;

a.const成员函数;
class MyClass
{
public:
  int Fun() const;
}
const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。获得能力:可以操作常量对象。失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。
1)类成员函数后加const不能修改类的除了mutable以外的成员变量
2)非const对象 调用 非const函数, 若不存在则调用相应的const版本
3)const对象只能调用const成员函数

const char * func(T2) 这是返回值是const对象的非const函数;


b. const成员变量;
  类型修饰符const不仅可以说明成员函数,也可以说明数据成员。由于const类型对象必须被初始化,并且不能更新,因此,在类中说明了const数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。
例如:
class A
{
public:
A(int i);
const int &r;
private:
const int a;
static const int b;
};

const int A::b=10; //static const init
A::A(int i):a(i), r(a) //const init in constructor
{
}

例如下面有这样一个例子:
class A
{
void func1() const //NO.1
{}
void func1() //NO.2
{}
void func2() const //NO.3
{}
void func3() //NO.4
{}
}

const A ca;
A a;

a.func1();//call NO.2
a.func2();//call NO.3
a.func3();//call NO.4

ca.func1();//call NO.1
ca.func2();//call NO.3
ca.func3();//error

是不是const的常量值一定不可以被修改呢?
观察以下一段代码:
const int i=0;
int *p=(int*)&i;
p=100;
通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。

--

没有评论: