常量成员
这一节将关键字const与类、对象相遇时碰撞出的火花。回忆一下const,const类型的变量或对象的值是不能被更新的,所以必须有初始化。关于const的用法,想起来一些了吧,下面讲新知识。
类的数据成员前面可以加上关键字const,称为常量成员。有三种:常量数据成员,静态常量数据成员,常引用。前两者的区别是静态常量数据成员还有一个关键字static,刚学过的,需要在类外初始化。最后一个常引用就是将引用说明为常量,该引用所引用的对象的值不能被更新。
class L
{
public:
L(int x, int y);
void incr(int y){a+=y;}
void Print(){cout<<"a= "<<a<<endl;}
private:
int a;
const int b; //常量数据成员
static const int c; //静态常量数据成员
const int & r; //常引用
};
const int L::c=123; //静态常量数据成员需要在类外初始化
L::L(int x, int y):b(y),r(a); //常量数据成员不能在函数体内赋值,只能在初始化列表赋初始值。
{
a=x;
}
类L有一个普通的数据成员a,常成员b,静态常成员c和常引用r。需要注意的地方均在注释中说明了。
常对象
定义对象时,在最前面加const,则该对象为常对象,务必一同进行初始化。之后该对象的值不能改变。例如:
const L l(3,5);
L const l(4,5);
上面两种写法都对。
常成员函数
使用关键字const说明的成员函数叫做常成员函数。只有常对象才能调用常成员函数,常成员函数中不能更新对象的数据成员,也不能调用没有const修饰的成员函数。比较绕,用例子说明。
#include <iostream>
using namespace std;
class L
{
public:
L(int x, int y):a(x),b(y){}
void incr(int y){a+=y;}
void Print(){cout<<"a= "<<a<<" b= "<<b<<endl;}
void Print()const;
private:
int a;
const int b; //常量数据成员
};
void Print()const
{
cout<<"a= "<<a<<" const b= "<<b<<endl;
}
void main()
{
L l1(1,2);
const L l2(3,4);
l1.Print();
l2.Print();
}
在类L中说明了两个同名函数Print,其中一个是常成员函数。类L中还有一个常成员b,它只能通过初始化列表进行初始化。
在main函数中创建对象l1,以及常对象l2。然后分别调用Print函数。输出为:
a= 1 b= 2
a= 3 const b= 4
也就是说对象l1调用的是普通的Print,而对象l2调用的是常成员函数Print。