返回变量时带与不带*this的差异及二叉树节点类函数影响
好问题!咱们直接拆解来看——在你给出的btnode类场景里,大部分情况下把this->去掉是完全没问题的,但也存在几种特殊情况会带来差异,下面具体说:
核心结论:大部分常规场景无差异
在非静态成员函数内部,直接访问类的成员变量(比如m_left)和用this->m_left访问,本质上是等价的。编译器会自动为成员变量的访问添加上当前对象的this指针,所以两种写法编译后的机器码完全一样,运行结果、性能都没有区别。
比如你例子里的get_left_btnode函数:
btnode* get_left_btnode () { return this->m_left; }
改成:
btnode* get_left_btnode () { return m_left; }
功能完全一致,都是返回当前节点的左子节点指针。
特殊场景:存在命名冲突时差异明显
如果成员函数的局部变量/参数和成员变量同名,直接写变量名会优先访问局部的那个,而this->会明确指向成员变量,这时候差异就会导致逻辑问题。
举个例子:
// 假设我们给get_left_btnode加了一个同名参数 btnode* get_left_btnode (btnode* m_left) { return m_left; // 这里返回的是传入的参数m_left,不是类成员变量m_left return this->m_left; // 明确返回类的成员变量m_left }
这种情况下,不用this->就会访问到局部/参数变量,完全不符合函数原本的设计意图。
进阶场景:模板类中的依赖名称(拓展)
如果是在模板类中,当成员变量依赖于模板参数时,有时候编译器无法自动识别它是类的成员变量,这时候必须用this->来显式标注,否则会编译报错。不过你的btnode类不是模板类,所以这个场景暂时不用考虑,但可以作为知识点记下来。
总结
回到你的btnode类:当前代码里没有同名的局部变量或参数,所以去掉this->完全安全,代码更简洁,也不会有任何功能或性能上的损失。但如果未来修改函数时加入了同名的局部变量/参数,记得要用this->来区分成员变量和局部变量哦。
内容的提问来源于stack exchange,提问作者Amaresh Kumar
相关产品推荐
相关产品推荐

