Struct

成员函数

成员函数就是写在 struct/class 里面的函数,并且属于这个对象本身。

换句话说:

  • 普通函数不属于任何对象
  • 成员函数属于某个类/结构体
  • 成员函数可以直接访问对象的成员变量(a、b、c)

普通函数(不属于任何对象)

int add(int x, int y) {
    return x + y;
}

这个函数不是任何对象的,它在全局空间。


📍 成员函数(属于某个对象)

struct Node {
    int a, b;

    int sum() {      // ← 这是成员函数
        return a + b; // 直接访问该对象的 a 和 b
    }
};

假设你写:

Node x;
x.a = 3;
x.b = 5;

cout << x.sum();   // 输出 8

这里:

  • x.sum() 就是 成员函数调用
  • sum() 属于 Node 这个结构体
  • sum() 内部可以直接用 ab

🧩 成员函数的隐藏参数 this

每个成员函数都有一个隐藏参数:

this → 指向当前对象的指针

所以当你写:

x.sum();

实际上是:

sum(&x);

这就是为什么成员函数可以访问 ab,因为会编译成:

this->a
this->b

⭐ 再看你的运算符重载

你写的:

bool operator<(const node &B) const {
    if (a == B.a) return b > B.b;
    return a > B.a;
}

这是一个成员函数,等价于:

bool operator<(const node *this, const node &B)

对应调用:

x < y

实际是:

x.operator<(y)

🔥 成员函数的主要特点总结

特点 解释
属于某个类/struct 在 class/struct 内部定义
隐式参数 this 自动指向当前对象
可以直接访问成员变量 不需要对象名
对象.函数() 调用 如 x.sum(), a.operator<(b)

📌 非成员函数 vs 成员函数对比

类型 写法 调用方式 能否访问成员变量
成员函数 写在 struct 里 x.fun() ✔ 可以直接访问
非成员函数 写在外面 fun(x) ✘ 不能直接访问(除非 friend)

⭐ 最终一句话总结

成员函数就是属于对象的函数,可以直接访问该对象的数据(成员变量),并通过 this 指针运行。


如果你愿意,我可以再给你讲:

  • 什么是 static 成员函数?
  • 什么是 this 指针?
  • 为什么 operator<< 必须是非成员函数?

随时问!

重载运算符

struct Node {
	int x,y;
	bool operator < (const Node & other) const {
		if(x != other.x) return x < other.x;
		return y < other.y;
	} 
};

如果用非成员函数写是这样子的:

bool operator<(const node &A, const node &B) {
    return A.a < B.a;
}

const node &B 的含义?

bool operator<(const node &B) const

重点就是参数里的:

const node &B

⭐ 一句话解释

传入一个 “只读的 node 引用” 作为比较对象。


⭐ 逐部分拆解解释

node

表示参数类型是一个 node 结构体。

也就是用来和 this 当前对象比较的另一个结构体。

例如:

a < b;  // 左边是 this,右边是 B

左边对象调用成员函数,右边对象当作参数传进来。


& —— 引用(reference)

不复制对象,直接引用原来的对象。

  • 节省时间(不复制大结构体)
  • 节省内存
  • 性能更高

若不这样做,每次比较都会 复制一个 B,效率非常低。


const —— 只读,不允许修改 B

含义:
保证函数内部不会修改 B 的内容。

例如:

B.a = 10;   // ❌ 不允许

为什么这样好?

  • 操作 < 时本来就不应该修改比较对象
  • 更安全
  • 编译器可做优化
  • 保证 < 是纯函数(pure),严格弱序才能用于 map / set / sort

如果去掉 const:

bool operator<(node &B);  // 没有 const

那你在比较时可以修改 B,会破坏排序逻辑,并且不能用于 set/map。


⭐ 总结

部分 解释
node 参数类型是结构体
& 引用传递,不复制对象,性能高
const 不能修改 B,更安全、更规范

组合成:

const node &B

就是:

传入一个不能被修改的结构体引用,用来和当前对象比较。

posted @ 2025-11-25 18:32  EcSilvia  阅读(17)  评论(0)    收藏  举报