类与对象之const修饰成员函数


常函数

  • 成员函数加const后我们称这个函数为常函数

  • 常函数内不可修改成员属性

  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

  • 类型 函数名(形式参数表) const

常对象

  • 声明对象前加const称该对象为常对象

  • 常对象只能调用常函数

  • const 类型名 常数据成员名

简单实例

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
int A_age;
mutable int B_age;//特殊变量mutable,即使在常函数中也能修改
void showperson() const
{
//this->A_age = 20;无法修改
//this->B_age = 30;可以
cout << "年龄:" << B_age<<endl;
}
};
void test01()
{
Person p;
p.B_age = 80;
p.showperson();
}
//常对象
void test02()
{
const Person p;
//p.A_age=20会报错
p.B_age = 30;//在常对象下也可以修改
//常对象只能调用常函数
p.showperson();
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
年龄:80
年龄:30

课本实例

#include<iostream>
#include<string>
using namespace std;
class Croster
{
string name;
int Math;
const double Score;//定义学分常数据成员
double GPA;//绩点
public:
Croster(string na = "undef", int m = 100, double s = 3);
double GetGPA() const;//常数据成员函数返回绩点
void Display() const;
void Display();

};
#include "l4_07.h"
Croster::Croster(string na, int m, double s) :name(na), Math(m), Score(s)
{
GPA = Math / 100.0 * Score;
}
double Croster::GetGPA() const
{
return GPA;
}
void Croster::Display()
{
cout << "This is void Display().\n";
cout << name << "get " << Math << endl;
cout << "Your GPA is " << GetGPA() << endl;
}
void Croster::Display()const
{
cout << "This is void Display() const.\n";
cout << name << "get " << Math << endl;
cout << "Your GPA is " << GetGPA() << endl;
}
#include "l4_07.h"
int main()
{
const Croster stu_A("赵衍", 92, 3);//定义常对象
Croster stu_B("孙立",98,3);
stu_A.Display();
stu_B.Display();
return 0;
}
This is void Display() const.
赵衍get 92
Your GPA is 2.76
This is void Display().
孙立get 98
Your GPA is 2.94

​ 该程序中的Display()函数有重载的版本,一个是常成员函数,另一个是普通成员函数,函数首部的最后是否有const加以区分。从运行结果可知,同样是调用Display()函数,常对象的调用的一定是常成员函数void Display() const,而普通对象在调用时遵循这样的原则:如果有普通成员函数的重载版本,则首先调用普通成员函数;否则,自动调用常成员函数,因为普通对象也是可以调用常函数的。


Author: T1g3r
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source T1g3r !
评论
  TOC