在C++中,const可以用来声明常量(包括指针和指针指向的变量),也可以在函数参数中用来修饰共享内存空间的指针或引用。同时,const还可以用在类和对象中,用于修饰对象和类的数据成员。
1 常数据成员
有时我们希望某些常量只在类中有效。由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现。
任何数据成员都不能在类中初始化,因为类只是一个类类型,只是提供了一个分配内存的蓝图,需要在定义对象时才能实际按这个蓝图去实现。也不能在构造函数体中进行赋值初始化,因为在构造函数的形参表中相当于做了声明,需要第一时间初始化,而到了函数体中的赋值操作,相当于是数据的更新操作,而不是初始化的。但常量是需要第一时间初始化的,C++编译器的做法是在类的构造函数的初始化列表中初始化 const 数据成员。
const 数据成员的含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。
#include<iostream.h> class CCircle { double r; const double PI; public: CCircle(double rr=0,double pi=3.14159):r(rr),PI(pi){} double Area() {return PI*r*r;} }; void main() { CCircle cir(2); cout<<cir.Area()<<endl; CCircle cir2(2,3.14); cout<<cir2.Area()<<endl; cin.ignore(); } /* 12.5664 12.56 */
怎样才能建立在整个类中都恒定的常量呢?别指望 const 数据成员了, 应该用类中的枚举常量来实现。例如
class A { //… enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量 int array1[SIZE1]; int array2[SIZE2]; };
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。
2常成员函数和常对象
const 用于修饰成员函数,表示该函数不能修改类成员数据,常量成员函数一般用常量对象来调用,而同名的成员函数可以被非常量对象来调用;
#include <iostream.h> class R { public: R(int r1,int r2) {R1=r1;R2=r2;} void print(); void print() const; private: int R1,R2; }; void R::print() { cout<<R1<<":"<<R2<<endl; } void R::print() const { cout<<R1<<";"<<R2<<endl; } void main() { R a(5,4); a.print(); const R b(20,52); b.print(); }
-End-