18

我对 C++ 相当陌生,我不明白this指针在以下场景中的作用:

void do_something_to_a_foo(Foo *foo_instance);


void Foo::DoSomething()
{
  do_something_to_a_foo(this);
}

我从这里的其他人的帖子中抓住了它。

this指向什么?我很困惑。该函数没有输入,那么在this做什么呢?

4

8 回答 8

34

this指当前对象。

关键字this标识一种特殊类型的指针。假设您创建了一个名为xof的对象class A,并且class A具有一个非静态成员函数f()。如果调用该函数,主体中x.f()的关键字存储的地址。thisf()x

于 2013-05-11T01:00:40.910 回答
9

简短的回答是这this是一个特殊的关键字,用于标识“this”对象——您当前正在操作的对象。稍长,更复杂的答案是这样的:

当你有 aclass时,它可以有两种类型的成员函数:static和非static. 非static成员函数必须对类的特定实例进行操作,并且它们需要知道该实例在哪里。为了帮助他们,该语言定义了一个隐式变量(即在需要时自动为您声明的变量,而无需您做任何事情),该变量将被调用this并将自动指向该类的特定实例成员函数正在运行。

考虑这个简单的例子:

#include <iostream>

class A
{
public:
    A() 
    { 
        std::cout << "A::A: constructed at " << this << std::endl;
    } 

    void SayHello()
    {
        std::cout << "Hi! I am the instance of A at " << this << std::endl;
    }
};

int main(int, char **)
{
    A a1;
    A a2;

    a1.SayHello();        
    a2.SayHello();

    return 0;
}

当您编译并运行它时,观察 和 之间的值this是不同a1a2

于 2013-05-11T01:11:55.283 回答
3

this只是一些关于补充其他答案的随机事实:

class Foo {
public:
    Foo * foo () { return this; }
    const Foo * cfoo () const { return this; /* return foo(); is an error */ }
};

Foo x;       // can call either x.foo() or x.cfoo()
const Foo y; // can only call x.cfoo()

当对象为const时, 的类型this变为指向 的指针const


class Bar {
    int x;
    int y;
public:
    Bar () : x(1), y(2) {}
    void bar (int x = 3) {
        int y = 4;
        std::cout << "x: " << x << std::endl;
        std::cout << "this->x: " << this->x << std::endl;
        std::cout << "y: " << y << std::endl;
        std::cout << "this->y: " << this->y << std::endl;
    }
};

this指针可用于访问被函数参数或局部变量覆盖的成员。


template <unsigned V>
class Foo {
    unsigned v;
public:
    Foo () : v(V) { std::cout << "<" << v << ">" << " this: " << this << std::endl; }
};

class Bar : public Foo<1>, public Foo<2>, public Foo<3> {
public:
    Bar () { std::cout << "Bar this: " << this << std::endl; }
};

多重继承会导致不同的父级具有不同的this值。只有第一个继承的父对象具有与this派生对象相同的值。

于 2013-05-11T01:33:08.000 回答
2

this是指向 self(调用this的对象)的指针。

假设你有一个名为 car 的类 Car 的对象,它有一个非静态方法 getColor(),在 getColor() 中对 this 的调用会返回 car 的地址(类的实例)。

静态成员函数没有this指针(因为它们与实例无关)。

于 2013-05-11T00:59:33.997 回答
2

这意味着调用 DoSomething() 的 Foo 对象。我用例子来解释

void do_something_to_a_foo(Foo *foo_instance){
    foo_instance->printFoo();
}

和我们班

class Foo{
    string fooName;
    public:
        Foo(string fName);
        void printFoo();
        void DoSomething();
};

Foo::Foo(string fName){
     fooName = fName;
}
void Foo::printFoo(){
      cout<<"the fooName is: "<<fooName<<endl;
}
void Foo::DoSomething(){
     do_something_to_a_foo(this);
}

现在我们实例化对象,例如

Foo fooObject("first);
f.DoSomething();//it will prints out first

同样,将传递给 Foo 构造函数的字符串将在调用 DoSomething() 时打印。
因为例如在上面示例的 DoSomething() 中,“this”表示 fooObject,而在 do_something_to_a_foo() 中,fooObject 是通过引用传递的。

于 2013-05-11T01:16:07.057 回答
2

会计。Balaguruswamy 用 c++ 进行面向对象编程

this是一个指针,指向this调用函数的对象。例如,函数调用A.max()会将指针设置this为对象的地址。指针this充当所有成员函数的隐式参数。

你会在this这里找到一个很好的指针示例。它也帮助我理解了这个概念。 http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

于 2016-08-02T09:09:27.910 回答
1

非静态成员函数,例如Foo::DoSomething有一个隐式参数,其值用于this. 该标准在 C++11 §5.2.2/4 中指定了这一点:

调用函数时,每个参数 (8.3.5) 都应使用其对应的参数进行初始化 (8.5, 12.8, 12.1)。[注意:此类初始化彼此之间的顺序是不确定的(1.9)-结束注释]如果函数是非静态成员函数,则函数的this参数(9.3.2)应使用指向对象的指针进行初始化调用的,如同通过显式类型转换 (5.4) 进行转换。

因此,您需要一个Foo对象来调用DoSomething. 该对象简单地变为this

this关键字和普通的、显式声明的指针参数之间的唯一区别(而且是微不足道的)const是您不能获取this.

于 2013-05-11T01:30:37.650 回答
0

它是一个本地指针。它将当前对象称为本地对象

于 2015-12-06T05:25:44.890 回答