Форум программистов, компьютерный форум CyberForum.ru

Что такое This и с чем его едят - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.81
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
27.09.2010, 18:42     Что такое This и с чем его едят #1
Доброго дня/ночи
Вот пытаюсь выкурить мануалы по теме "this". Прочитал надцать листов литературы, но так особо не могу понять - this возвращает только адрес обьекта, в котором он содержится?
вот пример, над которым я сижу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
using namespace std;
class ClassTMP
{
private:
    int data;
public:
    ClassTMP():data(){};
    ClassTMP(int a):data(a){};
    ClassTMP(ClassTMP& a)
    {
        data=a.data;
        cout << "Вызван перегруженый конструктор копирования\n";
    }
    ClassTMP& operator=(ClassTMP& a)
    {
        data=a.data;
        cout << "Вывзван перегруженый оператор присваивания\n";
        return *this;
    }
    void operator=(int a)
    {
        data=a;
        cout << "Вывзван перегруженый оператор присваивания цифpы\n";
    }
    void print()
    {
        cout << data << endl;
    }
    void input(int a)
    {
        data=a;
    }
};
int main()
{
    setlocale(LC_ALL,"Russian");
    ClassTMP a;
    ClassTMP b;
    
    a=5;
    b=a;
    a.print();
    //b.print();
    return EXIT_SUCCESS;
}
Если кто может, расскажите немного подробнее своими словами об сием чуде природы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2010, 18:42     Что такое This и с чем его едят
Посмотрите здесь:

C++ Что такое Класс, и с чем его едят?
C++ Что такое функции и с чем их едят?
C++ Что такое make-файлы и с чем их едят?
Что такое assoc и с чем его едят? C++
C++ что такое Qt, и с чем его едят?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
27.09.2010, 19:20     Что такое This и с чем его едят #2
this - неявный параметр в методах. При вызове метода на каком-то объекте адрес этого объекта неявно передаётся в функцию, чтобы можно было ссылаться на этот самый объект. Прямое обращение к членам класса - это просто более удобный способ не писать this-> по всему тексту. Простейший пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass{
public:
    void Foo() {a = 0;}
    void Bar() const {std::cout << a;}
private:
    int a;
};
 
void SomeFunc()
{
    MyClass c;
    c.Foo();
    c.Bar();
}
аналогичен такой записи:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct MyClass{
    int a;
};
 
void MyClass_Foo(MyClass * const This)
{
    This->a = 0;
}
 
void MyClass_Bar(const MyClass * const This)
{
    std::cout << This->a;
}
 
void SomeFunc()
{
    MyClass c;
    MyClass_Foo(&c);
    MyClass_Bar(&c);
}
Nwq
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
27.09.2010, 21:54     Что такое This и с чем его едят #3
Чтоб понять для чего нужен this, посмотри на функции с this в дизассемблере. Например при создании объекта ClassTMP, выделится 4 байта памяти для переменной data, адрес по которому находится эта переменная это и есть this. При вызове не статичной функции, в неё передаётся этот адрес, чтоб когда ты например делаешь this->data = 5; компилятор мог сформировать инструкцию вида mov dword ptr[this + 0], 5, а в не статичные функции this не передаётся, поэтому и получить доступ к data через this ты не сможешь.

Добавлено через 1 час 10 минут
в статичные функции this не передаётся. (опечатка)
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
27.09.2010, 22:07     Что такое This и с чем его едят #4
LineStown, Dвсе в самом деле просто.
Если б мы писали на Си, то
C
1
2
3
4
5
6
7
8
9
10
11
 
typedef struct { ... } S;
main()
{
S A;
func(&A, ...);
}
func(S *A, ...)
{
   A->... = ...
}
А на С++ в вызове func A присутствует неявно
C++
1
2
3
4
5
6
7
8
9
10
class S { ... };
main()
{
S A;
A.func( ...);
}
S::func(...)
{
   this->... = ...
}
Т.е. здесь в func в качестве параметра передается еще и ссылка на объект A, только в тексте этого не видно.
А внутри func этому невидному параметру есть сакраменттальный синоним [b]this[/] (этот)

Добавлено через 1 минуту
И мануалов никаких не нужно...
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
28.09.2010, 11:50  [ТС]     Что такое This и с чем его едят #5
Цитата Сообщение от Nwq Посмотреть сообщение
Например при создании объекта ClassTMP, выделится 4 байта памяти для переменной data, адрес по которому находится эта переменная это и есть
Гм вот тут интересно, я думал this содержит адрес обьекта (класса), а не адрес переменной в классе (хотя, если переменная одна, то адрес класса совпадает с адресом переменной)
Nwq
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
28.09.2010, 12:30     Что такое This и с чем его едят #6
Да, так и есть, я просто хотел чтоб ты понял что есть 'адрес объекта' и что по нему находится.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
28.09.2010, 12:33  [ТС]     Что такое This и с чем его едят #7
Цитата Сообщение от Nwq Посмотреть сообщение
Да, так и есть, я просто хотел чтоб ты понял что есть 'адрес объекта' и что по нему находится.
Угумс, понятно что ничего интересного нету в this В принципе понятно, где и зачем его использывать....
Спс всем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2010, 12:56     Что такое This и с чем его едят
Еще ссылки по теме:

Класс-контейнер? Что это такое и с чем его «едят»? C++
C++ Объясните что такое массив объединений и с чем его едят
Функции itoa и atoi: что это такое и с чем их едят? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.09.2010, 12:56     Что такое This и с чем его едят #8
Зыс - это неявный указатель на тот объект, который прописан через точку слева от каждого данного метода или на левый операнд каждого данного оператора. Используется в тех случаях, когда внутри метода, конструктора, или оператора локальными данными, операндами или параметрами перекрыты члены класса. Тогда без зыса локал, а с ним член. Иного применения придумать не могу.

Добавлено через 4 минуты
Явно писать зыс без перекрытия - это не применение, так как перед любым обращением к члену всё равно неявно ставится
C++
1
this->
.
Yandex
Объявления
28.09.2010, 12:56     Что такое This и с чем его едят
Ответ Создать тему
Опции темы

Текущее время: 12:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru