const 成员函数:
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。
在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。
所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
准确的说const是修饰this指向的对象的,
例如:
class A
{
public:
fun(int);
};
这里fun函数其实有两个参数,第一个是A*const this, 另一个才是int类型的参数,如果我们不想fun函数改变参数的值,可以把函数原型改为fun(const int),但如果我们不允许fun改变this指向的对象呢?因为this是隐含参数,const没法直接修饰它,就加在函数的后面了,const修饰*this是本质,至于说“表示该成员函数不会修改类的数据。否则会编译报错”之类的说法只是一个现象,根源就是因为*this是const类型的。
通过程序实例来说明const成员函数的特性(分析见程序):
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student(string str=NULL,double sco=0.0);
void set_student(string str,double sco);
string get_name() const;
double get_score() const;
void display();
void display() const;//加入const的成员函数可以与不加const的同名函数重载
private:
string name;
double score;
};
Student::Student(string str,double sco)
{
name=str;
score=sco;
}
void Student::set_student(string str,double sco)//需要改变数据成员,不能加const
{
name=str;
score=sco;
}
string Student::get_name() const//不需要改变数据成员,一般要加const
{
return name;
}
double Student::get_score() const//不需要改变数据成员,一般要加const
{
return score;
}
void Student::display()
{
cout<<"调用非const:"<<endl;
cout<<"name:"<<name<<",score:"<<score<<endl;
}
void Student::display() const
{
cout<<"调用const:"<<endl;
cout<<"name:"<<name<<",score:"<<score<<endl;
}
void display(const Student &stu)//外部函数:如果对象非cons型,则不管get_name()与get_socre()函数是否为const成员函数,都可以调用,
// 如果对象为const型,则get_name()与get_socre()函数必须为const成员函数
{
cout<<"外部函数:"<<endl;
cout<<"name:"<<stu.get_name()<<",score:"<<stu.get_score()<<endl;
}
int main()
{
Student stu1("lanzhihui",89.1);
stu1.display();//如果存在非const型的成员函数,则调用非const型的成员函数
//如果只存在const型的成员函数,则调用const型的成员函数
stu1.set_student("wangdan",19.9);
stu1.display();
const Student stu2("wangqian",19.3);
stu2.display();//必须调用const型的成员函数
display(stu1);
display(stu2);
system("pause");
return 0;
}
小节:
a.const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b.const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c.const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
d.作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
e.然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的