Что такое указатель this?

Я довольно новичок в C++, и я не понимаю, что this Указатель делает в следующем сценарии:

void do_something_to_a_foo(Foo *foo_instance);


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

Я взял это из чужого поста здесь.

Что значит this указать на? Я не совсем понимаю. Функция не имеет ввода, так что this делать?

8 ответов

Решение

this ссылается на текущий объект.

Ключевое слово this идентифицирует специальный тип указателя Предположим, что вы создаете объект с именем x из class A, а также class A имеет нестатическую функцию-член f(), Если вы вызываете функцию x.f()ключевое слово this в теле f() хранит адрес x,

Краткий ответ: this это специальное ключевое слово, которое идентифицирует "этот" объект - тот, над которым вы сейчас работаете. Немного более длинный и более сложный ответ:

Когда у вас есть class, он может иметь функции-члены двух типов: 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 отличается между a1 а также a2,

Просто некоторые случайные факты о 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 значение как производный объект.

Точность. к объектно-ориентированному программированию на С ++ от Balaguruswamy

this указатель, который указывает на объект, для которого this функция была вызвана. Например, вызов функции A.max() установит указатель this по адресу объекта. Указатель this Это действует как неявный аргумент для всех функций-членов.

Вы найдете отличный пример this указатель здесь. Это также помогло мне понять концепцию. http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

это указатель на себя (объект, который вызвал это).

Предположим, у вас есть объект класса Car с именем car, у которого есть нестатический метод getColor (), вызов которого внутри getColor () возвращает адрес car (экземпляр класса).

Статические функции-члены не имеют указателя this (поскольку они не связаны с экземпляром).

Это означает объект Foo, для которого вызывается DoSomething(). Объясняю это примером

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 передается по ссылке.

Нестатические функции-члены, такие как 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,

Указатель - это объект языка программирования, значение которого указывает на другое значение, хранящееся в другом месте в памяти компьютера с использованием его адреса памяти.

Можно также сказать, что указатель - это переменная, которая содержит адрес памяти в качестве своего значения.

Это локальный указатель. Он ссылается на текущий объект как локальный объект

Другие вопросы по тегам