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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

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

25.05.2013, 15:32. Просмотров 1504. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2013, 15:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос указатель this что именно он делает (C++):

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

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

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

Что в программе делает так, что процессор грузится на 100%? - C++
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот код программы, на компьютере жрет всю...

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

Что это за метод?И что он делает? - C++
double func (double y, int k, int n){ double y1; for (int i=0; i&lt;=n+1;i++) y1=0; double t; t=0; y1=1; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,026
25.05.2013, 15:47 #2
Цитата Сообщение от VLK Посмотреть сообщение
Много прочитал про оператор this
this - не оператор, а указатель. Хранит адрес объекта, метод которого вызван.
* - оператор разыменования указателя, т.е. получения значения, на которое он указывает.

В данном случае в this находится адрес объекта qwerty.
Смотрим на объявление метода:
Цитата Сообщение от VLK Посмотреть сообщение
C++
1
test_class operator++()
Следовательно, оператор ++ вернет новый объект типа test_class.

Добавлено через 59 секунд
Ведь в 8 и 9 строках оператор return почему-то не вызывает вопросов?
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
25.05.2013, 16:04  [ТС] #3
Цитата Сообщение от 0x10 Посмотреть сообщение
this - не оператор, а указатель.
Блин, только вчера нашел 2 темы на этом форуме, в обоих писалось что это не оператор, и я все равно на косячил в тексте, ну я имел ввиду указатель.


Цитата Сообщение от 0x10 Посмотреть сообщение
Ведь в 8 и 9 строках оператор return почему-то не вызывает вопросов?
Да, не вызывает, там всё куда проще, есть переменная, оператор return возвращает эту переменную, тут надо быть очень тугим, что бы этого не понимать, а вот что значит return *this что за *this, я все таки до конца не понимаю это для меня тоже самое что:

C++
1
2
int varOne=5;
return varTwo;
при том что varTwo нет, оно не объявлено.


Цитата Сообщение от Olivеr Посмотреть сообщение
del
Меня надо удалить с форума? за что? за то, что я подрываю его своей бездарностью?


Цитата Сообщение от 0x10 Посмотреть сообщение
новый объект
А как понять новый, что за новый? Речь идет о том, что при манипуляциях с объектом класса test_class в данном случае это qwerty будет создана его копия и именно этой копию он вернет, включая новые значения переменных? или как?
0
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,026
25.05.2013, 16:13 #4
Цитата Сообщение от VLK Посмотреть сообщение
Меня надо удалить с форума? за что?
Там был пост, который автор посчитал нужным удалить.

На самом деле, я предлагаю на секунду отойти от конкретно оператора инкремента, ибо в данном случае это еще больше запутает. Давайте напишем просто метод и назовем его inc, чтобы не огрести лишних забот.
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
25.05.2013, 16:15  [ТС] #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Там был пост, который автор посчитал нужным удалить.

На самом деле, я предлагаю на секунду отойти от конкретно оператора инкремента, ибо в данном случае это еще больше запутает. Давайте напишем просто метод и назовем его inc, чтобы не огрести лишних забот.
ладно, сейчас напишу другую программу, которая будет просто прибавлять 5, надеюсь об этом идет речь.
0
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,026
25.05.2013, 16:32 #6
Вот этот код понятен?
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
   int n = 10;
   int* pn = &n;
   int m = *pn;
 
   std::cout << "n = " << n << " at " << &n << std::endl;
   std::cout << "m = " << m << " at " << &m << std::endl;
 
    return 0;
}
Конкретно - строка 5.

Добавлено через 13 минут
В следующем приближении разыменование может происходить в функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int value_of(int* const p)
{
    // допустим тут что-то осмысленное
    return *p;
}
 
int main()
{
   int n = 10;
   int* pn = &n;
   int m = *pn;
   int k = value_of(&n);
 
   std::cout << "n = " << n << " at " << &n << std::endl;
   std::cout << "m = " << m << " at " << &m << std::endl;
   std::cout << "k = " << m << " at " << &k << std::endl;
 
    return 0;
}
По сути ничего не изменилось и тут вроде очевиднее что берется и куда возвращается.
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
25.05.2013, 16:33  [ТС] #7
Строка 3 - объявляется и инициализируется переменная n
Строка 4 - создается указатель *pn и адрес куда ведет этот указатель такой же как и у перемененной n, а точнее оба эти значения (10) находятся по одному адресу.
Строка 5 - объявляется новая переменная m и она инициализируется, ей присваивается значение указателя *pn т.е. 10, при этом она имеет свой адрес в памяти (отдельный от n / *pn)
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,388
Записей в блоге: 3
Завершенные тесты: 1
25.05.2013, 16:38 #8
Цитата Сообщение от VLK Посмотреть сообщение
а точнее оба эти значения (10) находятся по одному адресу.
Это одно значение.
0
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,026
25.05.2013, 16:42 #9
Цитата Сообщение от VLK Посмотреть сообщение
Строка 5 - объявляется новая переменная m и она инициализируется, ей присваивается значение указателя *pn т.е. 10, при этом она имеет свой адрес в памяти (отдельный от n / *pn)
Ну т.е. есть понимание, что в данном случае имеем два разных объекта. Т.е. в m копируется значение ячейки, на которую указывает pn. Ниже написал еще функцию - там происходит то же самое. С return *this - аналогично.
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
25.05.2013, 16:50  [ТС] #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int value_of(int* const p)
{
    return *p;
}
 
int main()
{
   int n = 10;
   int* pn = &n;
   int m = *pn;
   int k = value_of(&n);
 
   std::cout << "n = " << n << " at " << &n << std::endl;
   std::cout << "m = " << m << " at " << &m << std::endl;
   std::cout << "k = " << m << " at " << &k << std::endl;
 
   system("pause");
    return 0;
}
В строке 13 мы передаем в функцию адрес переменной n, в строке 3 инициализируется новый указатель *p и ему сразу же присваивается то значение, которое расположено по адресу переменной n, а точнее у них одно значение и расположено оно по одному адресу, а возвращает эта функция уже конкретное число, которое присваивается переменной k, которая имеет свой адрес, отдельный от n и *p.
И если мы находясь в функции изменим значение *p допустим на 20, то значение переменной n тоже изменится на 20.
0
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,026
25.05.2013, 17:00 #11
Цитата Сообщение от VLK Посмотреть сообщение
указатель *p и ему сразу же присваивается то значение, которое расположено по адресу переменной n
Он на то и указатель, чтобы хранить не значение а только адрес. Не более того.

Добавлено через 1 минуту
Вроде особых затруднений не наблюдаю. Или остались еще вопросы?

Добавлено через 5 минут
Ну докину еще код для размышлений
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
struct test
{
    int v;
};
 
test inc(test* const this_, int inc_value)
{
    test rv = *this_;
    this_->v += inc_value;
    return rv;
}
 
int main()
{
    test a;
    a.v = 10;
 
    test b = inc(&a, 1);
 
    std::cout << "a.v = " << a.v << std::endl;
    std::cout << "b.v = " << b.v << std::endl;
 
    return 0;
}
2
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
25.05.2013, 17:08  [ТС] #12
Цитата Сообщение от 0x10 Посмотреть сообщение
Вроде особых затруднений не наблюдаю. Или остались еще вопросы?
Мне надо некоторое время что бы переварить
Я напишу тогда попозже.

Добавлено через 7 минут
И надо кодом как раз подумаю
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
25.05.2013, 18:15 #13
VLK, перегрузка оператора инкремента - не самый удачный пример для понимания, что такое this.
this это указатель на экземпляр класса (переменную типа определяемого классом) для которого вызывается функция класса (не дружественный и не статический метод определённый в классе).
Что касается оператора ++, то у Вас не определён тип возврата. Для префиксного:
C++
1
2
3
4
ClassName& operator++(){//возвращается ссылка
fieldToInk++;
return *this;//возвращается ссылка на вызывающий экземпляр (на себя) и никакой копии не нужно
}
хотя работать будет и так:
C++
1
2
3
ClassName operator++(){//возврат не ссылка (как говорят люди опытные)))
fieldToInk++;
return *this;//возвращается даже не просто объект типа, содержащий  значение которое будет присвоено вызвавшему экземпляру, а при разименовании получается всё равно ссылка на себя, то есть налицо лишняя операция присвоения *this=*this. И ананимная копия для этого создаётся. То есть первый вариант правильнее.
А вот для постфиксного оператора тип возврата, - только тип класса:
C++
1
2
3
4
5
ClassName operator++(int){
ClassName noInkObjToReturn(*this);//сохранили в объекте состояние до инкремента
fieldToInk++;//инкрементировали в вызывающем(this)
return noInkObjToReturn;//возвращается ссылка на объект типа
}
т.к. для постфиксного нужно увеличить после использования в месте инкрементирования.
1
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,525
Записей в блоге: 26
25.05.2013, 18:37 #14
На всякий случай подкину ссылок. Там сумбур, но может что-то полезное сумеешь понять:

После компиляции VS2008 падает после удаления узла дерева, имеющего потомка
После компиляции VS2008 падает после удаления узла дерева, имеющего потомка
чем отличается вызов объекта через "." и через "->"
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
25.05.2013, 19:27 #15
Evg, хорошие ссылки, спасибо. Последнюю время от времени перечитываю. Речь в них идёт о доступе к членам через класс или его экземпляр. В последней теме не прозвучало, что создатель языка пытался предоставить альтернативу с-шному синтаксису даже для объявлений указателя, чтобы избежать интерпретации изнутри вправо а потом влево:
int *a;// * - указатель а, - имя, int - указывающий на int
вроде такого:
a -> int;
не поручусь за точность, но как-то так. То есть a это указатель на int.
Второй идеей была мысль избежать разноупотребления * в объявлениях и в разыменовании. При этом для совместимости, старый синтаксис оставался в силе. Этой идее не суждено было сбыться и возможно к лучшему. Но как оператор доступа стрелка прижилась. Конечно это для самодокументируемости (понятности) языка. Чтобы различать доступ через экземпляр и через указатель при чтении.
В этом топике, вопрос если я понял о скрытом указателе для функций членов. Он передается как скрытый аргумент и подставляется для имен членов внутри:
myField
this->myField
myFoo()
this->myFoo
а для операторов (бинарных) укзателем является указатель на вызывающий не через оператор доступа "." или "->", а по расположению слева. Если справа нужно, то там через друзей и значит явно через аргументы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 19:27
Привет! Вот еще темы с ответами:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? - C++
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это можно использовать??

Что именно выполняет эта программа? - C++
Прокоментируйте пожалуйста что происходит в программе со строчки : /*максимальное из чисел, встречающихся в заданной матрице более одного...

Возвращаемое значение. Что именно происходит? - C++
Имеется код класса &quot;Массив&quot;. Реализованы конструктор копии, деструктор, перегрузка операции присваивания и сложение массивов...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.05.2013, 19:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru