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

💡 一句话记住:

  • 成员函数:对象的行为
  • 静态函数:类的工具
  • 友元函数:被授权的"外部朋友"
  • 构造/析构:对象的出生与死亡仪式
相关推荐
hexu_blog9 分钟前
vue+java实现图片批量压缩
java·前端·vue.js
头歌实践平台15 分钟前
Hadoop开发环境搭建
java·大数据·hadoop
爱吃小白兔的猫23 分钟前
LPA算法详解:一种近线性时间的图社区发现方法
开发语言·php
Seven9737 分钟前
一致性Hash算法:如何实现分布式系统中的高效数据分片?
java
摇滚侠38 分钟前
IDEA 生成 try catch 快捷键
java·ide·intellij-idea
咩咦1 小时前
C++学习笔记02:cin 和 cout 输入输出
c++·学习笔记·cin·输入输出·cout
咩咦1 小时前
C++学习笔记05:引用和常引用
c++·学习笔记·引用·const·常引用
香蕉鼠片1 小时前
算法过程中不会的
开发语言·c++
阿旭超级学得完1 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表