学科分类
目录
C++基础

用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修饰,然后用常成员函数获取数据成员,保证数据不被修改。

● 若定义的是常对象,则只能调用常成员函数。

点击此处
隐藏目录