在C++中,常函数(const member functions)是指在类的成员函数声明和定义中使用 const
关键字修饰的函数。常函数的存在主要是为了在类的实例上提供一种保证:该函数不会修改类的成员变量。
在类的成员函数声明中,如果函数不会修改类的成员变量,可以将其声明为常函数。
常函数的格式
void myFunction() const{
//函数体
};
在这个示例中,myFunction()
被声明为常函数,表示它不会修改任何类的成员变量。在函数体中,可以访问类的成员变量,但不能修改它们。否则编译器会报错。常函数主要用于表示对类的只读操作,从而提供了一种保证,使得编译器可以在调用时进行更严格的类型检查。常函数可以在常对象上调用,这样就可以确保常对象的成员变量不会被修改。
示例:
class RolePlayer {
public:
//构造函数(带初始化列表)
RolePlayer(int HP) : m_nHP(HP){};
//深拷贝
void SetName(char * m_NPCName) {
this->m_NPCName = new char[strlen(m_NPCName) + 1];
memset(this->m_NPCName,0, strlen(m_NPCName) + 1);
strcpy(this->m_NPCName, m_NPCName);
}
//常函数
void printInfo() const{
std::cout << "Role HP:" << m_nHP << std::endl;
std::cout << "Role Name:" << m_NPCName << std::endl;
}
private:
char * m_NPCName = nullptr;
int m_nHP = 0;
}
printInfo()
函数被声明为常函数,并在其中打印了角色玩家的信息。即使我们尝试在常对象上调用 printInfo()
函数,编译器也会保证该函数不会修改任何成员变量。
(关于深拷贝以及构造函数如果不清楚可以查看我之前的文章)
在主程序中调用
int main() {
RolePlayer roleA(400);
char szName[] = "Wolven";
roleA.SetName(szName);
roleA.printInfo();
system("pause");
return 0;
}
最后结果:
在示例中创建了一个 RolePlayer
对象 roleA
,并通过构造函数传入了参数 400
,接着,使用 SetName
方法将名字设置为 "Wolven"。然后,调用了 printInfo
方法,打印了角色玩家的信息。由于 printInfo
方法被声明为常函数,它不会修改任何成员变量,因此可以在常对象上安全地调用它,而编译器会确保这一点。