在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-
