前面我们已经学习了C++中重要的知识点,特别是虚函数可能会有些懵逼,但是需要我们在实践中不断的理解和尝试,写代码是进步最快的方式,接下来将会介绍一些简单但很重要的知识点,本篇介绍常成员函数。
总结:
1. 常成员函数: 用于在程序中定义不可修改内部成员变量的函数
- 作用:无法修改数据成员,一般用来修饰
Get的函数 - 本质:this指针的类型:
constT* const - 意义:让编译器提醒开发者该函数修改类的成员变量,用于
const对象(引用或指针)
2. 编译器实现常成员函数原理
(1)普通的类成员函数this指针类型:T* const(表示该指针本身不能被修改)
(2)常成员函数this指针类型:const T* const(后面的const代表指针本身不能被修改,前面的const代表指向的内容不能被修改)
- 表示该指针本身不能被修改
- 表示指针指向的内容不能被修改
3. 常成员函数内部变量修改方法
- 通过指针强转去除
const属性 mutable关键字
在C++中其语法较为灵活,特别是指针可以说是杀手级的,允许你去改变进程中的任意一个内容,所以C++中尤其要做好检查。
1. 普通函数内部成员变量的可修改性
以下代码中int CInteger::GetNumber() {return m_nNumber;}作为获取变量的函数,其返回值我们是不希望被修改的,如何通过编译器来检查和实现m_nNumber不可被修改?
#include <iostream>
class CInteger
{
public:
CInteger(int nNumber) {
m_nNumber = nNumber;
}
int GetNumber();
void SetNumber(int nNumber) {
m_nNumber = nNumber;
}
private:
int m_nNumber;
};
int CInteger::GetNumber()
{
m_nNumber = 1;
return m_nNumber;
}
int main(int argc, char* argv[])
{
CInteger i = 1;
i.GetNumber();
return 0;
}
2. 常成员函数
前面我们学过使用const修饰一个变量,可以将其变为常量例如const int n=1。参考C++57个入门知识点_02_const常量限制(解决C中define无法指明数据类型问题、常量一旦定义生命周期内不可修改、编译器在程序编译时期做的检查、编译时不确定的,才可以通过指针修改运行时的值)
const也是可以用来修饰函数,const int GetNumber() 代表返回值为一个常量,而int GetNumber() const修饰的函数,被称为 常成员函数
常成员函数: 用于在程序中定义不可修改内部变量的函数
- 作用:无法修改数据成员,一般用来修饰
Get的函数 - 本质:this指针的类型:
constT* const - 意义:让编译器提醒开发者该函数修改类的成员变量,用于
const对象(引用或指针)
以下代码使用const修饰函数,在编译阶段实现内部不可以修改变量的限制。
#include <iostream>
class CInteger
{
public:
CInteger(int nNumber) {
m_nNumber = nNumber;
}
int GetNumber() const;
void SetNumber(int nNumber) {
m_nNumber = nNumber;
}
private:
int m_nNumber;
};
int CInteger::GetNumber() const
{
//Get函数作为获取变量的函数,返回值不能被修改
m_nNumber = 1;
return this->m_nNumber;
}
int main(int argc, char* argv[])
{
CInteger i = 1;
i.GetNumber();
return 0;
}
运行结果:变量m_nNumber不可被修改

3. 编译器实现常成员函数原理
编译器如何在使用int GetNumber() const之后,智能的分辨出加了const后就不能修改函数内的变量。
const常成员函数,声明修改
(1)普通的类成员函数this指针类型:T* const(表示该指针本身不能被修改)
(2)常成员函数this指针类型:const T* const(后面的const代表指针本身不能被修改,前面的const代表指向的内容不能被修改)
- 表示该指针本身不能被修改
- 表示指针指向的内容不能被修改
(1)普通的成员函数的this指针
CInteger* const代表了指针本身不能被修改,前面已知类对象的this指针是不能被修改的

(2)常成员函数的this指针
常成员函数this指针类型:const T* const(后面的const代表指针本身不能被修改,前面的const代表指向的内容不能被修改)

4. 常成员函数内部成员变量的修改
通过欺骗编译器的方法去修改常成员函数内的变量,有以下两种方法:
(1)通过指针强转去除const属性
int CInteger::GetNumber() const
{
CInteger* const p = (CInteger* const)this;
p->m_nNumber = 134;
return p->m_nNumber;
}
(2)mutable关键字
上述的方法比较挫,C++中提供了比较好的方法来修改常成员函数中常成员的值,只需要在成员变量前面加mutable。
class CInteger
{
public:
CInteger(int nNumber) {
m_nNumber = nNumber;
}
int GetNumber() const;
void SetNumber(int nNumber) {
//this=&nNumber;
m_nNumber = nNumber;
}
private:
mutable int m_nNumber;//如果想要在常成员函数内修改成员使用mutable int m_nNumber
};
int CInteger::GetNumber() const
{
m_nNumber = 1;
return m_nNumber;
}
5.学习视频地址:C++57个入门知识点_40 常成员函数
本文深入探讨C++中的常成员函数,解析其定义、作用及实现原理,并介绍如何在常成员函数中修改成员变量的方法。
8441

被折叠的 条评论
为什么被折叠?



