C++中类常见的函数分类

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) 局部回调、算法谓词

💡 一句话记住:

  • 成员函数:对象的行为
  • 静态函数:类的工具
  • 友元函数:被授权的"外部朋友"
  • 构造/析构:对象的出生与死亡仪式
相关推荐
小钻风33661 小时前
JWT初识
java·jwt·base64url
weixin_449173652 小时前
java使用poi保存表格和图片到word文件中
java·开发语言·word
好家伙VCC2 小时前
# 光计算驱动的编程范式革新:用Python实现光子神经网络模拟器在传统电子计算架构逼近物理极限的今天,**光计算**正
java·开发语言·python·神经网络
梵刹古音2 小时前
【C++】 虚指针(vptr)与虚函数表(vtable)
开发语言·c++
yqj2342 小时前
【无标题】
java·开发语言
REDcker2 小时前
curl开发者快速入门
linux·服务器·c++·c·curl·后端开发
游乐码2 小时前
c#结构体
开发语言·c#
tod1132 小时前
Redis C++ 客户端开发全流程指南
数据库·c++·redis·缓存