【问题标题】:When should you use the "this" keyword in C++? [duplicate]什么时候应该在 C++ 中使用“this”关键字? [复制]
【发布时间】:2025-12-19 17:50:10
【问题描述】:

可能的重复:
Is excessive use of this in C++ a code smell

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

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

最近,我的一位资历较浅的同龄人问我是否认为这是一个好主意,我发现我并没有一个很好的答案来满足我的喜好......这真的是一个完全风格的选择吗?为什么不在成员变量访问上加上 this-> 前缀更好?

【问题讨论】:

标签: c++ coding-style


【解决方案1】:

当函数参数和实例变量之间存在歧义时。

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

【讨论】:

  • 使用防止这种歧义的命名约定,例如在所有数据成员之前加上 m_。
  • m_ 和其他前缀一样可怕。
  • 就我个人而言,我认为像“在所有数据成员前面加上 m_”之类的东西只会引起毫无意义的噪音,就像匈牙利符号一样。它解决了这个“问题”,但对我来说似乎很愚蠢。
  • 为什么更喜欢命名约定而不是语言功能?
  • 不,我不会避免命名空间,我不会为所有名称添加前缀以防止命名空间,我只将 m_ 用于数据成员。关键是您需要清晰易读的代码。如果你省略了 m_ 之类的前缀并且仍然可以保持清晰的代码,那很好,那就不要使用它。就个人而言,如果我在数据成员前面加上 m_,我会发现我的代码更清晰。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    虽然这是一个完全主观的问题,但我认为一般 C++ 社区更喜欢拥有this->。它杂乱无章,完全不需要。

    有些人用它来区分成员变量和参数。更常见的做法是在成员变量前面加上一些东西,比如单个下划线或m,或m_,等等。

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

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

    这是我唯一一次使用this:当我出于某种原因实际上需要实例的地址时。

    【讨论】:

    • 显然“m_”是一种爱或恨的东西。我自己喜欢它。在同一方法中引用 p_Thing、l_Thing 和 m_Thing 并不罕见,其中 Thing 只是所有三者的逻辑名称。至少有两个冲突(例如 getter 和 setter)是很常见的,所以我认为一直应用约定是有意义的。
    • 你还在用m前缀吗?
    • @StackedCrooked:我不再编写太多 C++ 代码,所以没有。 :) 如果我这样做,那将是我公司的风格指南,即在名称末尾添加下划线。我的个人代码,我可能会出于习惯而使用相同的样式。
    • 绝对爱它或恨它,但无论使用什么编码风格,你的公司使用。 :P 就个人而言,我讨厌它。这很丑陋,我会说大多数时候与this-> 相同的批评适用于它。嗯。无论如何+1。 ;)
    • PHP 开发人员应该在实现他们的 OO 功能之前阅读此内容...
    【解决方案4】:

    当您在“高于”您正在使用的范围内有变量时,它是可用的。

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

    除了在另一个范围内访问变量之外,我本人同意您的“简约选择”。少即是多。 :-)

    【讨论】:

    • 这种情况应该避免。
    • 为什么要声明一个(按照惯例)错误地声称是成员变量的局部变量?
    • 当然你不应该这样命名一个局部变量,这只是一个例子。
    • 我知道已经很久了,但是为什么没有人意识到这里的代码不是真正的 C++?
    【解决方案5】:

    我喜欢用它来说明,就像访问继承的成员时一样。如果您没有传达该信息的命名约定,它会提醒读者变量的来源。

    在以下情况下必须使用 this 指针:

    • 返回当前对象。
    • 设置对象之间的关系(将this 传递给构造函数或设置器)
    • 检查自我参考:this != argPtr

    【讨论】:

      【解决方案6】:

      我只记得这样做过

      delete this;
      

      【讨论】:

      • 那句话有点吓人。话又说回来,我记得之前必须做if(this == null) 来帮助追踪一些奇怪的错误。
      • 我也在我的代码中使用过一两次。 Ph34r 立方米! :)
      • 这是 COM 等引用计数环境中的标准做法。
      • @Herms。实际上它很常见,如果使用得当,完全没有问题。
      • 哦,我知道它有时真的很有用。这只是让我的大脑“嘎嘎?!”的事情之一。当我第一次看到它时。
      【解决方案7】:

      对我来说,这取决于。如果它是一个短函数或变量,我只需输入它(例如 mCount)。然而,大多数时候,我使用非常具有描述性的成员变量和函数名称(例如 mExclusivelyLockedDigitalIOList )。在这些情况下,我倾向于使用 this 指针让 Visual Studio 的 IntelliSense 为我完成输入。节省击键和拼写错误。

      【讨论】: