You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++函数声明中&与self的含义及使用场景咨询

关于C++中classname::functionName(classname & self)语法的解析

嘿,我来帮你拆解这个语法里的各个部分,以及它的使用场景~

1. 参数里的&是什么?

这里的&是**引用(reference)**的符号,不是你可能以为的取地址运算符。它的核心作用有两个:

  • 以引用传递的方式接收传入的classname对象,避免拷贝新对象带来的性能开销;
  • 让函数直接操作原对象的内容(比如示例里修改IsOnline的值),如果去掉&写成classname self,函数只会修改对象的副本,原对象不会有任何变化。

2. self的含义和存在原因

self只是一个自定义的参数名称(换成obj、instance这类名字完全没问题),它的作用和非静态成员函数里的this指针几乎一致——代表当前要操作的对象实例。

那为什么要手动传self?看你的头文件声明:

static functionName(classname & self);

这个函数是静态成员函数。静态成员函数属于类本身,不属于任何具体对象,所以它没有默认的this指针。如果想让静态函数访问某个对象的非静态成员(比如示例里的m_state),就必须显式把这个对象的引用(或指针)传进去,self就是用来接收这个对象的参数。

3. 这种语法的使用场景

只有在静态成员函数需要访问非静态成员的时候,才会用到这种写法:

  • 静态函数默认只能访问类的静态成员,无法直接操作某个对象的非静态数据;
  • 如果业务需求里,静态函数必须操作特定对象的非静态成员(比如修改某个实例的在线状态),就必须手动传入对象的引用/指针,这时候就会出现类似classname & self的参数。

对比:非静态函数 vs 静态函数的写法

如果把这个函数改成非静态成员函数,就完全不需要self了:

// 非静态成员函数声明
void functionName();

// 实现
classname::functionName() {
    // 非静态函数自带this指针,等价于 this->m_state.mode.IsOnline = true;
    m_state.mode.IsOnline = true;
}

但因为你的函数是static的,没有this指针可以用,所以必须显式传对象引用,用self来替代this的作用。

关于你疑惑的“不用self也能实现功能”

你说得没错——如果是非静态成员函数,确实不需要self,因为this指针会自动指向调用函数的对象。但静态函数没有this,要操作非静态成员就必须手动传入对象,这时候self(或类似参数)就是必不可少的。


内容的提问来源于stack exchange,提问作者Ale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:40:08