在C++中,什么时候应该使用关键字"this"?

52

可能重复:
excessive use of this in C++ a code smell 是否过度使用 C++ 中的 this 是一种代码异味

多年前,我养成了在访问成员变量时使用 this-> 的习惯。我知道这并不是严格必要的,但我认为这样更清晰。

然后,在某个时候,我开始更喜欢更简约的风格,停止了这种做法...

最近,我的一位初级同事问我是否认为这是一个好主意,我发现我对自己的偏好没有一个好的答案... 这真的是完全基于风格的选择,还是没有前缀 this-> 访问成员变量更好的实际原因?


重复的问题:http://stackoverflow.com/questions/1128837/using-this-in-front-of-member-variables-in-c 和 https://dev59.com/jnNA5IYBdhLWcg3wL6yx - anon
请参阅“是否有必要使用this->?”:https://dev59.com/RHRB5IYBdhLWcg3wl4Oc - sth
6个回答

47
虽然这是一个完全主观的问题,但我认为C++社区普遍偏向于不使用this->。它会造成混乱,并且毫无必要。
有些人使用它来区分成员变量和参数。更常见的做法是给你的成员变量加上前缀,例如单个下划线或m,或m_等。
在我看来,这样更容易阅读。如果您需要this->来区分变量,则做错了。要么更改参数名称(从x更改为newX),要么采用成员变量命名约定。
最好保持一致性,因此不要为了少数需要区分而自己强制使用this->(请注意,在初始化程序列表中,这是完全定义良好的:x(x),其中成员x由参数x初始化),只需使用更好的变量名称。
这样就只剩下我使用this的时候:当我实际上需要实例的地址时,出于某种原因。

4
很明显,“m_”这个写法有喜爱和厌恶之分。我个人很喜欢它。在同一个方法中引用p_Thing、l_Thing和m_Thing并不罕见,其中Thing只是指所有三个的逻辑名称。通常至少会有两个冲突(例如 getters 和 setters),所以对我来说一直遵循这个约定是有意义的。 - user180247
1
你还在使用 m 前缀吗? - StackedCrooked
@StackedCrooked:我现在不怎么写C++了,所以不需要。 :) 如果我需要写的话,会按照公司的风格指南,在名称末尾添加下划线。但是我的个人代码,出于习惯,可能也会使用相同的样式。 - GManNickG
3
无论怎样,一定要使用公司所采用的编码风格,有人喜欢有人讨厌。个人而言,我讨厌它。它很丑,大部分时间都会受到同样的批评,就像this->一样。无所谓了,还是点个赞吧。 ;) - Xupicor
PHP开发人员在实现他们的面向对象特性之前应该先阅读这篇文章... - Déjà vu

9

我只记得曾经用这种方式做过

delete this;

4
那一行有点可怕。但我还记得以前为了追踪一些奇怪的 bug,必须写 if(this == null) - Herms
我在我的代码中也用过一两次。Ph34r m3! :) - Eugene
这是在像COM这样的引用计数环境中的标准做法。 - Georg Fritzsche
1
@Herms。实际上,如果使用正确的话,这是相当常见且毫无问题的。 - Tim
1
哦,我知道它有时确实很有用。但当我第一次看到它时,它会让我的大脑感到困惑。 - Herms

8

个人而言,我很少使用它,除了以下情况:

  • 当我需要将“this”作为另一个类的方法参数传递时
  • 在赋值运算符的实现中

6

当函数参数和实例变量之间存在歧义时,应该避免这种歧义!更好的方法可能是改变函数参数名称,而不是为所有访问实例参数增加开销(即前缀)...


21
m_很糟糕,任何其他前缀也是如此。 - Finglas
13
我个人认为诸如“在所有数据成员前加上m_”这样的事情只会产生无意义的噪音,就像匈牙利命名法一样。它固然可以解决这个“问题”,但对我来说似乎有些愚蠢。 - Herms
7
为什么更倾向于使用命名约定而不是编程语言特性? - Jeff Sternal
3
@Patrick:为什么?你是不是也避免使用命名空间,反而用某种伪命名空间作为前缀,比如 boost_shared_ptr 而非 boost::shared_ptr?使用 this-> 的好处在于当它不必要时可以省略,使代码更加简洁。你无法省略硬编码的 m_ 前缀。 - jalf
5
我不避免使用命名空间(namespace)也不为了防止使用命名空间而在所有名称前加前缀,我只在数据成员前加上m_。重要的是你想要清晰易读的代码。如果你省略像m_这样的前缀,但仍然能保持清晰的代码,那么就不用加。就我个人而言,如果在数据成员前加上m_前缀,我发现我的代码更加清晰。 - Patrick
显示剩余2条评论

3

我喜欢使用它来澄清继承的成员,如果您没有传达该信息的命名约定,它会提醒读者变量来自哪里。

以下情况必须使用此指针:

  • 返回当前对象。
  • 建立对象之间的关系(将this传递到构造函数或setter中)
  • 检查自引用:this != argPtr

2

对我来说,这要看情况而定。如果是一个简短的函数或变量,我只需输入它(例如mCount)。然而,在大多数情况下,我使用非常具描述性的成员变量和函数名称(例如mExclusivelyLockedDigitalIOList)。在这些情况下,我倾向于使用this指针,让Visual Studio的智能感知为我完成打字。这样可以节省击键和拼写错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接