用const修饰的成员函数
与类中用const修饰的数据成员类似,成员函数也可以用const修饰,声明为常成员函数。常成员的出现是为了实现数据保护,保证安全性。常成员函数使得对数据的访问只限定为读取,而保护了数据不被修改,在只需要获取数据的场合,通常使用常成员函数实现。对于常数据成员的访问通常使用常成员函数完成。
在类中,常成员函数通过const关键字说明,const关键字出现在形参列表后,常成员函数定义形式如下所示:
class 类名
{
public:
函数返回值类型 函数名(形参列表) const
{
函数体
}
…
};
常成员函数可访问类中的const数据成员和非const数据成员,但不可改变它们,常成员函数不可调用非const成员函数。非const成员函数可以读取常数据成员,但不可修改。
接下来通过一个案例来说明常成员函数的用法,如例1所示。
例1
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 class Student //定义Student类
6 {
7 public:
8 Student(string con_name, int con_id);
9 ~Student();
10 string get_stdname() const; //用const声明常成员函数
11 void print_stdname();
12 private:
13 string m_strName;//const string m_strName;
14 int m_nID;
15 };
16 //定义Student的构造函数
17 Student::Student(string con_name, int con_id):m_strName(con_name)
18 {
19 m_nID = con_id;
20 }
21 Student::~Student()
22 {
23 }
24 string Student::get_stdname() const //定义常成员函数,获取学生姓名
25 {
26 //m_strName = "Paul"; //错误,常成员函数不可以修改成员的值
27 return m_strName;
28 }
29 void Student::print_stdname() //普通成员函数,显示学生姓名
30 {
31 //m_strName = "Paul"; //正确, 普通成员函数可以修改成员的值
32 cout << "std's name:" << m_strName << endl;
33 }
34 int main()
35 {
36 Student std_tom("Tom", 20);
37 std_tom.print_stdname(); //调用普通成员函数
38 cout << std_tom.get_stdname() << endl; //调用常成员函数
39 system("pause");
40 return 0;
41 }
运行结果如图1所示。
图1 例1运行结果
例1中定义了常成员函数get_stdname()以及普通成员函数print_stdname()。常成员函数只可读取数据成员而不可修改,如增加代码第26行,则编译出错。普通成员函数对普通数据成员可以进行读写操作,如增加第31行,程序正常运行。
常成员函数中的this指针为常量型,以此防止对数据成员的意外修改。常对象只能调用其常成员函数。
由上面的例子,总结常成员函数的使用规则有如下几点:
● 若类中某些数据成员的值允许改变,另外的数据成员不可改变,则可将不需改变的成员声明为用const修饰的常数据成员。可用非const成员函数获取常数据成员的值,访问或修改普通数据成员。
● 若类中所有的数据成员均不改变,则可将所有的数据成员用const修饰,然后用常成员函数获取数据成员,保证数据不被修改。
● 若定义的是常对象,则只能调用常成员函数。