Что такое указатель 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
,
Указатель - это объект языка программирования, значение которого указывает на другое значение, хранящееся в другом месте в памяти компьютера с использованием его адреса памяти.
Можно также сказать, что указатель - это переменная, которая содержит адрес памяти в качестве своего значения.
Это локальный указатель. Он ссылается на текущий объект как локальный объект