【问题标题】:Is it okay to use the this pointer? [duplicate]可以使用 this 指针吗? [复制]
【发布时间】:2011-06-12 06:29:55
【问题描述】:

可能的重复:
Is there any reason to use this->
When should this-> be used?
When should I make explicit use of the this pointer?

当使用指向类的指针时,我喜欢在类中的变量前面添加一个this->,以便更清楚地表明我正在谈论的变量是在当前类中,而不是临时变量等. 所以我的台词会是这样的

if(this->thing > other->thing)
    this->doFoo();

代替

if(thing > other->thing)
    doFoo();

可以添加多余的this,还是会降低代码的可读性?

【问题讨论】:

标签: c++ class pointers this this-pointer


【解决方案1】:

我也喜欢这种模式,但我更喜欢托管代码中的“this”。 - 箭头操作符确实感觉有点吵,但是当你提到实例级的东西时它仍然很清楚。

【讨论】:

    【解决方案2】:

    这是一个风格问题,因此答案将是主观的。同样,与我共事过的很多人都喜欢在成员变量前面加上m_,以表明它是一个成员。 (m_foo 就像你的this->foo。)那么我敢肯定,有些人认为这是对宇宙的犯罪。 YMMV。使用适合您和您可能与之共事的任何人的方法。

    this-> 的一个优点(或缺点,取决于你问的是谁)是你可以拥有一个同名的变量,它既可以是成员,也可以是局部范围的东西,如参数或局部变量,例如:

    foo bar;
    
    void f(foo bar)
    {
       this->bar = bar;
    }
    

    【讨论】:

    • 我在“反宇宙犯罪”阵营:-) 我想我宁愿使用this-> 而不是将类别信息编码到名称中。我讨厌szBuffer之类的东西。哦,是的,离开我的草坪 :-)
    • 我只想为我对宇宙犯下的持续罪行道歉。我强烈喜欢在成员变量前加上 m_ 或只是一个下划线。
    • 我喜欢这些回复。有些东西告诉我,无论我们如何命名事物,宇宙都会“继续宇宙化”,但我试图说明人们对风格的东西有强烈的感觉。 :-)
    • Gran Torino 参考文献 +1。
    【解决方案3】:

    这取决于你的编码风格,但很多人会使用

    _myVariable
    m_myVariable
    myVariable_
    

    区分成员变量。

    但最重要的是保持一致

    【讨论】:

    • +1 一致性被低估了。
    • 不喜欢标识符开头的“_”。非常接近保留的标识符名称。 O. 恕我直言,它看起来很糟糕。
    【解决方案4】:

    当您的方法参数和成员变量具有相同名称时,通常使用this 表示法。 (区分方法参数和成员变量)

    例如说,

    void CMYClass::fun1(int sameName)
    {
    ...
    this->sameName = sameName;
    }
    

    否则,这只是口味问题......

    【讨论】:

      【解决方案5】:

      一致性一致性一致性。

      我认为this-> 前缀是一种有效的编码风格,如果您在整个项目中使用它来访问成员的任何地方。

      我更喜欢为成员使用表示前缀,例如m_。我觉得它比明确的 this->:

      更少切割器和更少的标签汤
      (alpha-this->gamma > this->alpha-gamma)
      

      对比

      (alpha-m_gamma > m_alpha-gamma)
      

      (dotNetties 已将 m_ 标记为已过时 - 我出于恶意在小型 C# 项目中使用它。但无论如何,任何其他不同的前缀也可以。)

      我看到它经常用于帮助智能感知启动,或专门过滤成员 - 这没关系,尽管出于这个原因将其保留是有问题的,尤其是如果没有始终如一地使用。

      【讨论】:

      • 我们中的大多数“dotNetties”仍然在私有成员前加上下划线,即使我们只是秘密地这样做。 :-) 微软在整个框架中自己做。这比记住在前面加上this. 更容易和更干净,而且在没有区分大小写标识符的VB.NET 中几乎是必需的(我碰巧认为这是一个更好的主意)。无论如何,+1 以保持一致性。
      • 我现在也为我使用的少数“严肃”(即其他人看到的)C# 工具这样做。如果它只是一个草稿程序,那么它是我在 C++ 和 C# 之间切换时发现的为数不多的困难之一。
      【解决方案6】:

      如前所述,这主要是风格问题。

      我个人不将它用于数据成员(我使用m 前缀替代),但我确实将它用于功能:

      • 为了与模板化代码保持一致,this 可能需要延迟查找
      • 为了清楚起见,为了一目了然地区分它是类的方法(可能是基类)还是独立的函数

      我认为,由于您在阅读某些代码时绝对不想在基类的各个层级上苦苦挣扎,this-> 的澄清使读者更加更容易。而且只需再输入 6 个字符。

      【讨论】:

      • 每行还有 6 个字符使腕管保持在附近! :)
      • 成员变量还使用m前缀吗?
      • @StackedCrooked:在工作中我必须使用_;对于个人项目,我使用了m(或者有时习惯性地使用_),尽管距离我上次在家里用C++编程已经有一段时间了。这些天,Rust 吸引了我所有的注意力。
      【解决方案7】:

      当然可以,而且编译器会为你添加。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-16
        • 2018-05-16
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多