用const修饰数据成员
有时,希望类中的数据成员在对象使用中不被改变,可以把这样的成员定义为常数据成员,比如定义一个表示圆形的类,类中会用到圆周率PI值,该值不希望在对象中被修改,则可将记录PI值的变量定义为常数据成员。类中定义常数据成员的形式如下所示:
class 类名
{
const 数据类型 数据成员;
};
常数据成员必须进行初始化并且不能被更新。普通数据成员可以在构造函数中通过初始化表或函数内的赋值语句给出初值,若想对常数据成员进行初始化只能通过初始化表完成,不能在构造函数内部进行赋值。常数据成员的初始化方法如下所示:
类名::类名(形参列表):常数据成员1(值), 常数据成员2(值)
{
构造函数体
}
下面定义一个Circle类,其中描述PI值的是常数据成员,具体代码如下所示:
class Circle //定义Circle类
{
public:
Circle(double con_radius); //声明构造函数
private:
const double PI; //常数据成员PI,记录圆周率
double m_fRadius;
};
//构造函数定义,常数据成员通过初始化表完成初始化
Circle::Circle(double con_radius):PI(3.1415)
{
}
接下来通过一个案例说明常数据成员的操作方法,如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3
4 class Circle //定义类Circle
5 {
6 public:
7 Circle(double con_radius); //声明构造函数
8 double circumference(); //声明求圆周长的函数
9 private:
10 double m_fRadius; //数据成员,记录圆的半径
11 const double PI; //常数据成员,描述圆周率
12 };
13 //定义构造函数,常数据成员通过初始化表初始化
14 Circle::Circle(double con_radius):PI(3.14)
15 {
16 m_fRadius = con_radius;
17 }
18 double Circle::circumference()
19 {
20 return 2 * PI * m_fRadius;
21 }
22
23 int main()
24 {
25 Circle c1(2); //定义Circle对象c1
26 cout << "circumference:" << c1.circumference() << endl;
27 system("pause");
28 return 0;
29 }
运行结果如图1所示。
图1 例1运行结果
例1第11行定义了常数据成员PI,记录圆周率的值,在构造函数中通过初始化表对其进行了初始化,如代码第14行所示。
对常数据成员只能进行读取,若想通过赋值的方式对常数据成员保存新数据,编译不通过,例2-17若添加如下代码,则编译出错。
void Circle::set_PI(double value)
{
PI = value; //不可对常数据成员进行赋值操作
}