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

dic*_*oce 41 c++ coding-style

可能重复:
在C++中过度使用此代码气味

多年前,我养成了在访问成员变量时使用this->的习惯.我知道这不是绝对必要的,但我认为它更清楚.

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

最近我被一个更年轻的同龄人问到我是否认为这是一个好主意而且我发现我对自己的偏好没有真正的答案...这真的是一个完全风格的选择还是有真正的原因为什么不在成员变量访问前加上this->更好?

GMa*_*ckG 39

虽然这是一个完全主观的问题,但我认为一般的C++社区不愿意这样做this->.它的混乱,完全不需要.

有些人用它来区分成员变量和参数.一个更常见的做法是只用一些前缀的成员变量,就像一个下划线或m,或m_

在我看来,这更容易阅读.如果你需要this->区分变量,你做错了.要么改变参数名称(从xnewX)或具有一个成员变量的命名约定.

一致性是首选,因此this->在需要区分的少数情况下不要强迫自己(注意在初始化列表中这是完全明确定义的:x(x)其中成员x由参数初始化x),只需获得更好的变量名称.

这留下了我唯一使用的时间this:当我实际需要实例的地址时,无论出于何种原因.

  • 很明显,"m_"有点像是爱或恨.我自己喜欢它.在同一方法中引用p_Thing,l_Thing和m_Thing并不罕见,因为Thing只是所有三个的逻辑名称.通常至少有两次冲突(例如,getter和setter),这对我来说只是一直应用约定是有意义的. (3认同)
  • 绝对喜欢 - 或者 - 恨 - 它 - 但是 - 使用 - 无论编码风格 - 你的公司用途.:P就个人而言,我讨厌它.这很难看,而且我会说大多数时候同样的批评也适用于`this->`.咩.+1无论如何.;) (2认同)

Tim*_*Tim 9

我只记得这样做

delete this;
Run Code Online (Sandbox Code Playgroud)

  • 这条线有点可怕.再说一次,我记得以前要做'if(this == null)`来帮助追踪一些奇怪的bug. (4认同)

Pat*_*ick 8

我个人从不使用这个,除了:

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


jld*_*ont 6

例如,函数参数和实例变量之间存在歧义.

当然应避免这种含糊不清!最好更改函数参数名称,而不是为实例参数的所有访问产生开销(即前缀),尽管......

  • m_太可怕了,就像任何其他前缀一样. (20认同)
  • 就个人而言,我认为像"在所有数据成员之前使用m_"这样的事情只会产生毫无意义的噪音,就像匈牙利符号一样.它解决了这个"问题",但对我来说似乎很愚蠢. (13认同)
  • 为什么更喜欢命名约定语言功能? (7认同)
  • 不,我不避免命名空间,我没有前缀所有名称以防止命名空间,我只使用m_为数据成员.关键是你想要清晰,可读的代码.如果你省略像m_这样的前缀并且仍然可以保持清晰的代码,那么就不要使用它.就个人而言,如果我用m_作为数据成员的前缀,我发现我的代码更清晰. (5认同)
  • 使用防止这种歧义的命名约定,例如在所有数据成员之前使用m_. (3认同)
  • @Patrick:为什么?你是否也避免命名空间,而是在你的所有名称前加上某种伪名称空间,如`boost_shared_ptr`而不是`boost :: shared_ptr`?关于`this->`的好处是它可以在不必要时省略,从而产生更清晰的代码.你不能省略硬编码的`m_`前缀. (3认同)

Pat*_*ick 5

如果变量位于您正在使用的范围"上方"的范围内,则它可用.

int i;
public void foo() {
    int i;
    i = 3; // assign local variable
    this->i = 4; // assign global variable
}
Run Code Online (Sandbox Code Playgroud)

除了访问另一个范围内的变量,我自己也同意你的"简约选择".少即是多.:-)

  • 我知道这已经很久了,但是为什么没有人意识到这里的代码不是真正的C++? (9认同)
  • 应该避免这种情况. (3认同)