C ++:“这个”指针没用吗?

时间:2014-01-28 04:18:21

标签: c++ class pointers this

在下面的代码中,我是否放“this->”并不重要或删除它。它在两种情况下都给出相同的输出和结果。 那么,在C ++中使用“this”指针有什么意义呢?还有其他必要的用法吗? 感谢。

#include<iostream>
using namespace std;

class square{
    int l;
    int w;
    public:
        square(int x, int y){
            w = x;
            l = y;
        }
        int getArea(){
            return w * l;
        };
        bool AreaSmallerThan(square c){
            if(this->getArea() < c.getArea())
                return true;
            else
                return false;
        }

};

int main(){
    square A(2,3);
    square B(1,3);
    if(A.AreaSmallerThan(B))
        cout<<"A is smaller than B."<<endl;
    else
        cout<<"A is NOT smaller than B."<<endl;
    return 0;
}

4 个答案:

答案 0 :(得分:7)

是的,有时候它是必不可少的。典型案例在operator=,以避免在自我分配期间破坏资源。

例如https://stackoverflow.com/a/3975092/103167

Set& Set::operator=(const Set& setEqual)
{
  //first check for self assignment
  if (&setEqual == this)
    cout << "this is self assignment";
  return *this;
}

(请注意,使用复制和交换习惯用法时不需要这样做)

在模板代码中经常可以看到通过this访问成员,模板代码继承自模板参数。这些继承的名称只能在第二阶段查找期间找到,这意味着他们需要使用this->

进行限定

答案 1 :(得分:7)

TL; DR:它有它的用途。如果您选择了良好的命名实践,通常不需要经常使用它。

在许多情况下,您需要“指向当前对象的指针”,例如:

struct Foo
{
    void MakeCallback(eventid_t eventId)
    {
        scheduleCallback(eventId, callbackProxyFn, this);
    }

    static void callbackProxyFn(eventid_t eventId, Foo* foo)
    {
        // call 'callback' on the relevant object instance.
        foo->callback(eventId);
    }

    void callback(eventid_t eventId);
};

如果您选择使用可怕的命名约定,它还可以用于解决当前对象和其他范围中的名称之间的冲突。

void Foo::bar(int n)
{
    this->n = n;
}

你可以通过为静态,全局和成员加前缀来避免这种(双关语)场景,这是常见的做法:

class Player {
    int m_score;
public:
    Player(int score) : m_score(score) {}
};

Player g_player1;
static Player s_login; // yeah, I know, terrible, just an example tho.

常见的用途是在复制/比较运算符中消除self:

bool Foo::operator==(const Foo& rhs) const
{
    if (this == &rhs)
         return true;
    ...
}

您还可以使用它来生成对当前对象的引用:

foo(const Foo&);

void foo(*this);

答案 2 :(得分:6)

随机示例...如果您已将int w, int l传递到getArea()函数中...那么您需要使用this关键字来区分本地参数

int getArea(int w, int l){
        return this->w * this->l;
    };

另一个常见示例可能是移动作业。我已经粘贴了一个我编码的Tree数据结构项目中的示例。

     /* move assignment */
    TreeSet& operator= (TreeSet&& rhs)
    {
        clearAll(rootPtr);
        this->rootPtr = rhs.rootPtr;
        rhs.rootPtr = nullptr;
        return *this;
    }

最后我写了一个迭代器的另一个例子......在迭代器上重载++运算符时,你想返回结果迭代器。

 /* Update the current pointer to advance to the node
         * with the next larger value
         */
        const_iterator& operator++ () {
            //I have deleted all the logic for the sake of not taking up a ton of space..
            return *this;
        }

答案 3 :(得分:0)

一般来说,当一个类的实例调用某个方法并且实例本身需要从该方法内部传递给该类之外的某个函数时,'this'指针会很有用。