在C++的类体系中,成员函数是绑定到类上的函数,用于操作类的成员变量或实现类的相关功能,根据特性和使用场景的不同,成员函数可以分为普通成员函数、常成员函数和静态成员函数三类。

普通成员函数的定义
普通成员函数是类的默认成员函数类型,定义时不需要添加特殊修饰符,其语法格式如下:
class Student {
private:
int score; // 学生分数
public:
// 普通成员函数定义,设置分数
void setScore(int s) {
score = s;
}
// 普通成员函数定义,获取分数
int getScore() {
return score;
}
};
普通成员函数有隐藏的this指针,指向调用该函数的对象实例,因此可以直接访问对象的非静态成员变量和非静态成员函数。
常成员函数的定义
常成员函数是在函数声明和定义的末尾添加const修饰符的成员函数,其语法格式如下:
class Student {
private:
int score;
public:
// 常成员函数定义,获取分数,承诺不修改对象成员
int getScore() const {
return score;
}
// 错误示例:常成员函数不能修改非mutable成员变量
// void addScore(int s) const {
// score += s; // 编译会报错
// }
};
常成员函数的this指针是指向常对象的指针,因此不能修改对象的非mutable成员变量,也不能调用其他非const成员函数,主要用来读取对象的状态,避免意外修改对象内容。
静态成员函数的定义
静态成员函数是在声明和定义时添加static修饰符的成员函数,其语法格式如下:
class Student {
private:
static int totalCount; // 静态成员变量,记录学生总人数
int score;
public:
Student(int s) : score(s) {
totalCount++;
}
// 静态成员函数定义,获取学生总人数
static int getTotalCount() {
return totalCount;
}
};
// 静态成员变量类外初始化
int Student::totalCount = 0;
静态成员函数不属于某个具体的对象实例,没有this指针,因此只能访问类的静态成员变量和静态成员函数,不能直接访问非静态成员。
常成员函数与静态成员函数的区别
二者的核心差异可以从以下几个维度对比:
| 对比维度 | 常成员函数 | 静态成员函数 |
|---|---|---|
| this指针 | 有,是指向常对象的指针 | 无 |
| 访问成员变量权限 | 可以访问非静态成员变量(不能修改非mutable成员),不能访问静态成员变量(除非是mutable) | 只能访问静态成员变量,不能访问非静态成员变量 |
| 调用方式 | 通过对象实例调用,常对象只能调用常成员函数 | 可以通过类名直接调用,也可以通过对象实例调用 |
| 主要用途 | 读取对象状态,不修改对象内容 | 实现和类相关但不依赖具体对象的功能,操作类级别的共享数据 |
| 是否能被const对象调用 | 可以 | 可以 |
| 是否能被非const对象调用 | 可以 | 可以 |
使用示例
以下是一个综合使用三种成员函数的完整示例:
#include <iostream>
using namespace std;
class Student {
private:
static int totalCount; // 静态成员变量,学生总人数
int score; // 非静态成员变量,学生分数
public:
Student(int s) : score(s) {
totalCount++;
}
// 普通成员函数,设置分数
void setScore(int s) {
score = s;
}
// 常成员函数,获取分数
int getScore() const {
return score;
}
// 静态成员函数,获取总人数
static int getTotalCount() {
return totalCount;
}
};
// 静态成员变量初始化
int Student::totalCount = 0;
int main() {
// 创建两个学生对象
Student stu1(90);
Student stu2(85);
// 调用普通成员函数
stu1.setScore(95);
// 调用常成员函数
cout << "stu1的分数:" << stu1.getScore() << endl;
cout << "stu2的分数:" << stu2.getScore() << endl;
// 调用静态成员函数,通过类名调用
cout << "学生总人数:" << Student::getTotalCount() << endl;
// 也可以通过对象调用静态成员函数
cout << "学生总人数:" << stu1.getTotalCount() << endl;
// 常对象只能调用常成员函数
const Student stu3(88);
cout << "stu3的分数:" << stu3.getScore() << endl;
// stu3.setScore(90); // 编译报错,常对象不能调用非const成员函数
return 0;
}
通过上述内容可以看出,合理选择成员函数类型能让代码的逻辑更清晰,也能更好地发挥C++面向对象特性的优势。