const回顾
const int a = 10; //a不能被改变
int const *p; //指针的指向可变,指向里的值不可变
int * const p; // 指针的指向不可变,指向里的值可变
int const * const p; //都不可变
const int fun(){} //返回值是不可以被改变的
常成员函数
因为所有非常成员函数都可以对其类中的数据成员进行修改,这使得私有数据成员很不安全,,如果想让一个成员函数不能对数据成员进行修改,那么就要用到常成员函数实现。
常成员函数的作用:在常成员函数中,不能对成员变量进行修改,进而保护数据成员。
常成员函数定义格式:
返回值类型 函数名(参数列表) const
{
函数体;
}
非常成员函数定义格式:
返回值类型 函数名(参数列表)
{
函数体;
}
示例:
#include <iostream>
using namespace std;
//封装 学生 类
class Stu
{
private:
string name;
int age;
public:
//无参构造函数
Stu() {}
//有参构造函数
Stu(string n, int a):name(n),age(a) {}
void show() const
{
//age = 78; 常成员函数不能修改数据成员的值
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
}
void show()
{
age = 78; //非常成员函数不能修改数据成员的值
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
}
};
int main()
{
Stu s("zhangsan",3);
s.show();
return 0;
}
通过示例可知,示例中常成员函数shou()与非常成员函数shou()构成了函数重载。
在常成员函数中this指针的格式:
类名 * const this;
在非常成员函数中this指针的格式:
const 类名 * const this;
常对象
常对象的作用:常对象,表明这个对象的所有数据成员不能被改变。
常对象定义格式:
const 类名 对象名;
示例:
#include <iostream>
using namespace std;
//封装 学生 类
class Stu
{
private:
string name;
int age;
public:
//无参构造函数
Stu() {}
//有参构造函数
Stu(string n, int a):name(n),age(a) {}
//常成员函数
void show() const //Stu const * const this 都不可变
{
//age = 78; 常成员函数不能修改数据成员的值
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
}
//非常成员函数
void show() // Stu * const this 指向不可变 指向的值可以变
{
age = 78;
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
}
};
int main()
{
//非常对象
Stu s("zhangsan",3);
s.show();
//常对象
const Stu s1("lisi",4);
s1.show();
return 0;
}
注意事项
- 常对象只能调用常成员函数,如果没有常成员函数,则报错。
- 非常对象对于常成员函数和非常成员函数都可以调用,优先非常成员函数。
- 常成员函数和非常成员函数可以构成重载,原因this指针类型不同。