C++中类常见的函数分类
✅ 一、成员函数(Member Functions)
特点:
- 定义在类内部(或外部用
Class::限定) - 隐式访问
this指针,可直接操作对象的成员变量 - 必须通过对象实例调用(除非是静态成员函数)
cpp
class MyClass {
public:
int x;
void print() { cout << x; } // 成员函数
};
MyClass obj;
obj.print(); // 必须通过对象调用
✅ 二、静态成员函数(Static Member Functions)
特点:
- 用
static声明 - 没有
this指针,不能访问非静态成员变量/函数 - 可以不通过对象直接用类名调用
- 常用于工具函数、工厂方法、计数器等
cpp
class Counter {
static int count; // 静态成员变量
public:
static int getCount() { return count; } // 静态成员函数
Counter() { ++count; }
};
int Counter::count = 0;
// 调用方式(无需对象!)
cout << Counter::getCount() << endl;
🔔 注意:静态成员函数只能访问 静态成员变量 和 其他静态成员函数。
✅ 三、友元函数(Friend Functions)
特点:
- 不是类的成员函数 ,而是独立的全局函数(或另一个类的成员)
- 用
friend关键字在类内声明 - 可以访问类的私有(private)和保护(protected)成员
- 常用于运算符重载(如
operator<<)
cpp
class Point {
double x, y;
friend void printPoint(const Point& p); // 声明友元
};
// 全局函数,但能访问 private 成员!
void printPoint(const Point& p) {
cout << "(" << p.x << ", " << p.y << ")"; // ✅ 合法!
}
Point p{1.0, 2.0};
printPoint(p); // 直接调用全局函数
⚠️ 友元破坏封装性,应谨慎使用,仅在必要时(如 I/O、比较)使用。
✅ 四、构造函数(Constructor)与析构函数(Destructor)
虽然它们也是成员函数,但因其特殊性常单独分类:
| 类型 | 作用 | 是否可重载 | 是否有返回值 |
|---|---|---|---|
| 构造函数 | 初始化对象 | ✅ 可重载 | ❌ 无(连 void 都不能写) |
| 析构函数 | 清理资源 | ❌ 不可重载 | ❌ 无 |
cpp
class Resource {
public:
Resource() { cout << "Created\n"; } // 构造
~Resource() { cout << "Destroyed\n"; } // 析构
};
✅ 五、运算符重载函数(Operator Overloads)
本质上是特殊的成员函数或友元函数,用于自定义运算符行为:
cpp
class Vec {
int x, y;
public:
// 成员函数形式(左操作数必须是本类对象)
Vec operator+(const Vec& other) const {
return {x + other.x, y + other.y};
}
// 友元形式(支持左右都是非本类,如 int + Vec)
friend Vec operator*(int k, const Vec& v) {
return {k * v.x, k * v.y};
}
};
✅ 六、Lambda 表达式(虽不在类内定义,但常与类交互)
严格来说 lambda 不是"类中的函数",但它常被用作成员函数内的局部回调:
cpp
class TaskRunner {
public:
void run() {
auto callback = [this]() { // 捕获 this,可调用成员函数
this->log("Task done");
};
execute(callback);
}
private:
void log(const string& msg) { cout << msg; }
void execute(function<void()> f) { f(); }
};
📊 总结对比表
| 函数类型 | 是否属于类 | 需对象调用? | 能访问私有成员? | 典型用途 |
|---|---|---|---|---|
| 普通成员函数 | ✅ 是 | ✅ 是 | ✅ 是 | 对象行为(如 draw(), update()) |
| 静态成员函数 | ✅ 是 | ❌ 否(可用类名调用) | ✅ 仅静态成员 | 工具函数、工厂方法 |
| 友元函数 | ❌ 否(全局或其它类) | ❌ 否 | ✅ 是 | 运算符重载、I/O |
| 构造/析构函数 | ✅ 是 | 特殊(创建/销毁时自动调用) | ✅ 是 | 初始化/清理资源 |
| Lambda(捕获 this) | ❌ 否 | 视情况 | ✅ 是(通过 this) | 局部回调、算法谓词 |
💡 一句话记住:
- 成员函数:对象的行为
- 静态函数:类的工具
- 友元函数:被授权的"外部朋友"
- 构造/析构:对象的出生与死亡仪式