Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236

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

25.05.2013, 15:32. Показов 4759. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот код:

Кликните здесь для просмотра всего текста
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?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2013, 15:32
Ответы с готовыми решениями:

обьясните что именно делает функция this
Обьяснте пожалуйста что делает функция this?

Объясните что именно делает функция даном коде
Помогите пожалуйста. Я не могу понять что делает функция которая стоит вначале моего кода, точнее я немогу понять почему там k&lt;=N/2....

Объясните что именно делает "x%d, y%d: " или что это в даном коде
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double rast(double x1, double y1, double x2, double y2) // Функція яка...

28
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
26.05.2013, 12:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
неправильная конструкция, не прижилась, а осталась!( Она была в С-структурах при доступе через указатель.)

Не по теме:

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

1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.05.2013, 13:26
OhMyGodSoLong, я написал криво: "стрелка...прижилась"
надо было :"осталась", так как в Си это оператор доступа к членам через указатель на структуру. Совместимость с Си то есть. Про полиморфизм тут не говорил.
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
26.05.2013, 13:59  [ТС]
Кликните здесь для просмотра всего текста
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 не получается
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.05.2013, 14:00
VLK, еще раз: this указывает на тот объект, метод которого вызван. Смотрите на строки 34, 37, 40.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.05.2013, 14:00
Цитата Сообщение от VLK Посмотреть сообщение
Кажется я начал понимать, указатель this используется только в функциях-членах класса и указывает он на конкретный объект, который есть в функции, т.е. в строке 15 объявляется объект temp и указатель this ссылается именно на него, верно?
Почти. Только не в одних только функциях-членах, а в функциях-членах и операторах-членах.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
26.05.2013, 14:34  [ТС]
Цитата Сообщение от 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 бесполезна.

Все правильно?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.05.2013, 14:41
Цитата Сообщение от VLK Посмотреть сообщение
по факту return a является return*this
Вот этого не понял, остальное вроде похоже на правду.
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
26.05.2013, 14:51  [ТС]
Цитата Сообщение от 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).

Только не спрашивайте как мне этот бред мог прийти в голову
т.к. это по крайне мере не логично, потому что в функции-члене может создаваться несколько объектов и на какой тогда указывать..
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.05.2013, 18:23
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;
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2013, 18:23

объясните что именно делает функция
Добрый час ! имеется следующий набор функций. не совсем понятен конечный результат. к примеру $sourceNumber=2111; //Разложение...

Прокомментируйте отрывок кода, что именно он делает
Дан следующий кодConsole.Write(&quot;Введите m:&quot;); int m = Convert.ToInt32(Console.ReadLine()); sign_choice4(1, 0,...

Как именно в методах расширения указать, что переходить нужно именно главный контроллер?
В проекте есть несколько Areas. Маршрутизация нстроена так (для наглядности сократил) public class RouteConfig { ...

Инициализация делает указатель из целого числа
Выдает ошибку на мой указатель, может я не правильно объявил указатель COORD goRight(COORD pk, int dx) { HANDLE hout1 =...

Нюансы синтаксиса: что означает указатель на указатель?
//Как работает 6 строчка? #include &lt;iostream&gt; using namespace std; int main( void ) { double **p = 0; *( *( p = new...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru