23.常函数和常函数
1.const修饰成员函数
●用const修饰的成员函数时,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量,
● 当成员变量类型符前用mutable修饰时例外。
//const修饰成员函数
class Person{
public:
Person(){
this->mAge = 0;
this->mID = 0;
}
//在函数括号后面加上const,修饰成员变量不可修改,除了mutable变量
void sonmeOperate() const{
//this->mAge = 200; //mAge不可修改
this->mID = 10; //const Person* const tihs;
}
void ShowPerson(){
cout << "ID:" << mID << " mAge:" << mAge << endl;
}
private:
int mAge;
mutable int mID;
};
int main(){
Person person;
person.sonmeOperate();
person.ShowPerson();
system("pause");
return EXIT_SUCCESS;
}
2.const修饰对象(常对象)
●常对象只能调用const的成员函数
● 常对象可访问 const 或非 const 数据成员,不能修改,除非成员用mutable修饰
程序1:
class Person
{
public:
Person()
{
this->mAge = 0;
this->mID = 0;
}
void ChangePerson() const
{
mAge = 100;
mID = 100;
}
void ShowPerson()
{
cout << "ID:" << this->mID << " Age:" << this->mAge << endl;
}
public:
int mAge;
mutable int mID;
};
void test()
{
const Person person;
//1. 可访问数据成员
cout << "Age:" << person.mAge << endl;
//person.mAge = 300; //不可修改
person.mID = 1001; //但是可以修改mutable修饰的成员变量
//2. 只能访问const修饰的函数
//person.ShowPerson();
person.ChangePerson();
}
程序2:
#pragma warning(disable:4996)
//2022年9月22日21:46:00
#include <iostream>
using namespace std;
class Maker
{
public:
int id;
int mAge;
mutable int score;//mutable修饰的成员变量
public:
Maker(int id, int age)
{
this->id = id;
this->mAge = age;
score = 100;
}
//常函数
void printMaker() const//1.函数后面加上const,该函数就是常函数
{
//id = 100;//err 2.常函数内不能修改普通成员变量
//3.const修饰的是this指针指向的空间中的变量,不能修改
//Maker *const this;
//变成
//const Maker *const this;//这是常函数修饰的
score = 200; //4.mutable修饰的变量在常函数中可以修改
cout << "score = " << score << endl;
}
};
void test01()
{
Maker m(1, 18);
m.printMaker();
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
输出结果:
score = 200
请按任意键继续. . .
程序3:
#pragma warning(disable:4996)
//2022年9月22日22:28:03
#include <iostream>
using namespace std;
class Maker
{
public:
int id;
int mAge;
mutable int score;//mutable修饰的成员变量
public:
Maker(int id, int age)
{
this->id = id;
this->mAge = age;
score = 100;
}
//常函数
void printMaker() const//1.函数后面加上const,该函数就是常函数
{
//id = 100;//err 2.常函数内不能修改普通成员变量
//3.const修饰的是this指针指向的空间中的变量,不能修改
//Maker *const this;
//变成
//const Maker *const this;//这是常函数修饰的
score = 200; //4.mutable修饰的变量在常函数中可以修改
cout << "score = " << score << endl;
}
};
void test01()
{
Maker m(1, 18);
m.printMaker();
}
void test()
{
//1.在数据类型前面加上const,让对象成为常对象
const Maker m(1, 18);
//m.id = 100;常对象不能改变普通成员变量的值
//m.func();//常对象不能调用普通成员函数
m.printMaker();//常对象可以调用常函数
m.score = 500;//常对象可以修改mutable修饰的成员变量
Maker m2(2, 20);
m2.printMaker();//普通对象可以调用常函数
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
输出结果:
score = 200
score = 200
请按任意键继续. . .
参考资料
参考资料来源于黑马程序员等