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

указатель this что именно он делает - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
25.05.2013, 15:32     указатель this что именно он делает #1
Вот код:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class test_class
{
public:
void set_var(int a, int b) { varOne = a; varTwo = b; }
test_class operator++() { varOne++; varTwo++; return *this; }
int get_varOne() { return varOne; }
int get_varTwo() { return varTwo; }
    
private:
int varOne;
int varTwo;
};
 
int main()
{
test_class qwerty;
qwerty.set_var(0,10);
    
std::cout << "varOne: " << qwerty.get_varOne() << "\n";
std::cout << "varTwo: " << qwerty.get_varTwo() << "\n";
 
qwerty++;
std::cout << "varOne: " << qwerty.get_varOne() << "\n";
std::cout << "varTwo: " << qwerty.get_varTwo() << "\n";
qwerty++;
std::cout << "varOne: " << qwerty.get_varOne() << "\n";
std::cout << "varTwo: " << qwerty.get_varTwo() << "\n";
        
system("pause");
return 0;
}


Много прочитал про оператор this, но все же осталось смутное представление о нем, думаю на практике, на примере, удастся понять до конца, подскажите, в строчке 7 часть кода: return *this куда именно и что именно возвращает оператор return ?

Правильно ли я понимаю, что return *this возвращает новое значение двух переменных (varOne и varTwo), по тому адресу, по которому они находятся? в объекте qwerty?
т.е. сначала они ( переменные varOne и varTwo) были 0 и 10, и находились по адресам, допустим varOne - 00001, varTwo - 00002, после выполнения операции инкремента, в эти адреса (00001 и 00002) return *this возвращает новые значения, 1 и 11?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.05.2013, 12:59     указатель this что именно он делает #21
Цитата Сообщение от IGPIGP Посмотреть сообщение
неправильная конструкция, не прижилась, а осталась!( Она была в С-структурах при доступе через указатель.)

Не по теме:

Полиморфизм — это неправильно?..

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
26.05.2013, 13:26     указатель this что именно он делает #22
OhMyGodSoLong, я написал криво: "стрелка...прижилась"
надо было :"осталась", так как в Си это оператор доступа к членам через указатель на структуру. Совместимость с Си то есть. Про полиморфизм тут не говорил.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
26.05.2013, 13:59  [ТС]     указатель this что именно он делает #23
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class music
{
public:
 
music() {  }
music(int k, int d, int m) { kol = k; dl = d; mb = m; }
~music() {  }
 
void show() { std::cout << "KOL: " << kol << " DL: " << dl << " MB: " << mb << "\n"; }
    
music fun_this(music sss)
{
music temp = sss;
return *this;
}
 
music fun_temp(music vvv)
{
music temp = vvv;
return temp;
}
    
private:
int kol;
int dl;
int mb;
};
 
int main()
{
music a(2,2,2);
a.show();
 
music b = a.fun_this(a);
b.show();
 
music c = a.fun_temp(a);
c.show();
 
system("pause");
return 0;
}


Кажется я начал понимать, указатель this используется только в функциях-членах класса и указывает он на конкретный объект, который есть в функции, т.е. в строке 15 объявляется объект temp и указатель this ссылается именно на него, верно?

Добавлено через 2 минуты
И еще подскажите, я создаю переменную со своим типом, из программы выше music h;, все нормально, я присваиваю ей значение, а как ее вывести на экран, через std::cout не получается
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.05.2013, 14:00     указатель this что именно он делает #24
VLK, еще раз: this указывает на тот объект, метод которого вызван. Смотрите на строки 34, 37, 40.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.05.2013, 14:00     указатель this что именно он делает #25
Цитата Сообщение от VLK Посмотреть сообщение
Кажется я начал понимать, указатель this используется только в функциях-членах класса и указывает он на конкретный объект, который есть в функции, т.е. в строке 15 объявляется объект temp и указатель this ссылается именно на него, верно?
Почти. Только не в одних только функциях-членах, а в функциях-членах и операторах-членах.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
26.05.2013, 14:34  [ТС]     указатель this что именно он делает #26
Цитата Сообщение от 0x10 Посмотреть сообщение
VLK, еще раз: this указывает на тот объект, метод которого вызван. Смотрите на строки 34, 37, 40.
А, вот теперь кажется понял:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class music
{
public:
 
music() {  }
music(int k, int d, int m) { kol = k; dl = d; mb = m;  }
~music() {  }
 
void show() { std::cout << "KOL: " << kol << " DL: " << dl << " MB: " << mb << "\n"; }
    
music fun_this(music sss)
{
music temp(5,5,5);
return *this;
}
                
private:
int kol;
int dl;
int mb;
};
 
int main()
{
music a(2,2,2);
std::cout << "A(2,2,2) - ";
a.show();
 
music b(3,3,3);
std::cout << "B(3,3,3) - ";
b.show();
 
music c = a.fun_this(a);
std::cout << "C(5,5,5) - ";
c.show();
        
system("pause");
return 0;
}


т.е. в строчке 35 используется для вызова функции-члена объект a и по-этому, в этой функции-члене в строке 16 указатель *this указывает на объект a, а не на temp или какой-нибудь другой. (в сообщении до этого я думал что указатель *this указывает на temp т.к. он создавался в этой функции члене и возвращал его значение, т.е. return temp являлось return*this, но по факту return a является return*this - это про пример в предыдущем сообщении!)
И в данном случае строка 15 бесполезна.

Все правильно?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.05.2013, 14:41     указатель this что именно он делает #27
Цитата Сообщение от VLK Посмотреть сообщение
по факту return a является return*this
Вот этого не понял, остальное вроде похоже на правду.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
26.05.2013, 14:51  [ТС]     указатель this что именно он делает #28
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот этого не понял, остальное вроде похоже на правду.
Это конечно не лучший пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
....
music fun_this(music sss)
{
music temp(5,5,5);
return *this;
}
 
....
 
music a(2,2,2);
music c = a.fun_this(a);
....
Я считал что return *this будет равнозначен return temp т.е. music c будет равен music c(5,5,5), но на самом деле, из-за того, что мы используем для вызова функции-члена объект a то *this указывает именно на a и в итоге получается что return a равнозначен return*this, и в итоге music c будет равен music c(2,2,2)

Моя ошибка была в том, что я думал что указатель *this указывает на объект созданный в функции (в данном случае temp), но он указывает на тот объект при помощи которого была вызвана данная функция (в данном случае a).

Только не спрашивайте как мне этот бред мог прийти в голову
т.к. это по крайне мере не логично, потому что в функции-члене может создаваться несколько объектов и на какой тогда указывать..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 18:23     указатель this что именно он делает
Еще ссылки по теме:

Объясните что именно делает "x%d, y%d: " или что это в даном коде C++
Что это за знак >> прочитал что это сдвиг вправо? что он делает C++
C++ Что именно выполняет эта программа?

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
26.05.2013, 18:23     указатель this что именно он делает #29
VLK, вызывающий объект это переменная класса от которой через точку (оператор доступа) вызывается функция-член. 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
using namespace std;
class music
{
public:
music() {  }
music(int k, int d, int m) { kol = k; dl = d; mb = m;  }
~music() {  }
void show() {cout<<"KOL: "<<kol<<" DL: "<<dl<<" MB: "<<mb<<"\n"; }
music fun_this(music sss)//вернет music 
{
music temp(5,5,5);//этот объект просто будет уничтожен при выходе из функции 
return *this;//это новый объект (копия вызывающего создастся при присвоении), так как возвращается объект типа music
}
music& ref_fun_this()//вернет music& - ссылку ЭТОТ ПРИМЕР САМЫЙ НУЖНЫЙ см. историю про c и d остальное - варианты
{
return *this;//это ссылка на сам вызывающий объект, а не копия так как метод возвращает ссылку
}
music& ref_fun_from_ref(music& isCallingObj)//вернет music& - ссылку 
{
if(&isCallingObj==this) cout<<endl<<"Вызывающий и вызываемый это один объект"<<endl;
else
 cout<<endl<<"Вызывающий и вызываемый это разные объекты"<<endl;
return isCallingObj;//
}
music& ref_fun_from_ptr(music* isCallingObj)//вернет music& - ссылку 
{
if(isCallingObj==this) cout<<endl<<"Вызывающий и вызываемый это один объект"<<endl;
else
 cout<<endl<<"Вызывающий и вызываемый это разные объекты"<<endl;
return *isCallingObj;//
}
//private://это пока не важно
int kol;
int dl;
int mb;
};
int main(){
setlocale (LC_CTYPE, "Russian");
music a(2,2,2);
cout << "A(2,2,2) - ";
a.show();
music b(3,3,3);
cout << "B(3,3,3) - ";
b.show();
cout << endl;
music c = a.fun_this(a);//вернёт копию a то есть с содержит то же, что и a : 2,2,2
a.kol=123;//изменим a
cout << "a(123,2,2) - ";
a.show();
cout << "C(2,2,2) - ";
c.show();cout<<" a изменилась, а c - нет, потому, что с это копия a";
cout << endl;
cout << endl;
music& d = c.ref_fun_this();//вернёт ссылку на c тоесть d и с это один и тот же объект 2,2,2 
c.kol=456;//изменим c
cout << "c(456,2,2) - ";
c.show();
cout << "d(456,2,2)!! - ";
d.show();cout<<" c и d изменились, потому, что d - ссылка на c, то есть то же что и c )";
cout << endl;
music& f = d.ref_fun_from_ref(d);
d.kol=789;//изменим d
cout << "d(789,2,2) - ";
f.show();
cout << "f(789,,2,2) - ";
f.show();cout<<" f и d изменились, потому, что f - ссылка на d, то есть то же что и d )";
cout << endl;
music& g = b.ref_fun_from_ptr( &b );
g.kol=101;//изменим g
cout << "g(101,3,3) - ";
g.show();
cout << "b(101,3,3) - ";
b.show();cout<<" g и b изменились, потому, что g - ссылка на b, то есть то же что и b )";
cout << endl;
cout << endl;
system("pause");
return 0;
}
Yandex
Объявления
26.05.2013, 18:23     указатель this что именно он делает
Ответ Создать тему
Опции темы

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