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

Указатель this - как и когда его использовать - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 384, средняя оценка - 4.66
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
15.01.2010, 22:20     Указатель this - как и когда его использовать #1
Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2010, 22:20     Указатель this - как и когда его использовать
Посмотрите здесь:

C++ Получить указатель из функции и использовать его в другой функции
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++
C++ указатель, как его перевести? с++
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
15.01.2010, 23:31     Указатель this - как и когда его использовать #21
insideone,
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
#include <iostream>
 
using namespace std;
 
class qstring{
    char* data;
    int Index;
public:
    qstring(const char* newData){
        data = new char[strlen(newData) + 1];
        //data = newData;
        strcpy(data, newData);
    }
    ~qstring(){ delete[] data; }
 
    char &operator[] (int newIndex){
        Index = newIndex;
        return data[Index];
    }
 
    void out() { cout << data << endl; }
};
 
int main()
{
    qstring QS("Hello World?");
    QS.out();
    QS[3] = '!';
    QS.out();
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 23:32     Указатель this - как и когда его использовать #22
Сообщение от Genius Ignat
malloc отдыхает
Значит отдыхает.
Ну что привязался.
Просто sizeof в параметре увидал.
Мысль проскользнула какая-то.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
15.01.2010, 23:40     Указатель this - как и когда его использовать #23
2 ISergey Спасибо, а принципиально возвращать char& или qstring& ? Я имею ввиду производительность. И... применительно к многобайтовым кодировкам это будет работать так же?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
16.01.2010, 00:00     Указатель this - как и когда его использовать #24
принципиально возвращать char&
В данном случаи да..
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
16.01.2010, 00:08     Указатель this - как и когда его использовать #25
В смысле... почему? Я думал что так передается ссылка т.е. адрес.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.01.2010, 12:11     Указатель this - как и когда его использовать #26
Цитата Сообщение от insideone Посмотреть сообщение
В смысле... почему? Я думал что так передается ссылка т.е. адрес.
совет: почитай книгу по С++. много вопросов отпадёт.
рекомендую эту: isbn 5-8459-1121-4
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
16.01.2010, 16:34     Указатель this - как и когда его использовать #27
Оператором new ты выделяешь 20 байт в памяти.
Далее возвращаешь указатель на этот кусок памяти, грубо говоря указатель - это адрес 1 элемента куска памяти.
И разве есть разница возвращать указатель на char или на свой класс? Это же все равно один адрес.
Книжку полистал
Когда же лучше использовать параметры-ссылки, а когда – параметры-указатели? В
конце концов, и те и другие позволяют функции модифицировать объекты, эффективно
передавать в функцию большие объекты типа класса. Что выбрать: объявить параметр
ссылкой или указателем?
Как было сказано в разделе 3.6, ссылка может быть один раз инициализирована
значением объекта, и впоследствии изменить ее нельзя. Указатель же в течение своей
жизни способен адресовать разные объекты или не адресовать вообще.
Поскольку указатель может содержать, а может и не содержать адрес какого-либо объекта, перед его использованием функция должна проверить, не равен ли он нулю.
Если параметр объявлен
как ссылка, функция получает его l-значение, а не копию. Лишнее копирование
исключается.
Т.е. вроде тут тоже описывается что разницы нет. Т.к. мне не нужно изменять адрес объекта (ведь это возвращаемое значение а не какая то переменная в функции) то можно возвращать что угодно. Ну и ладно. Вопрос был в том что не хуже ли по производительности возврат MyClass& чем PrimitiveClass& и я понял что нет.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
16.01.2010, 17:18     Указатель this - как и когда его использовать #28
insideone:
Круто изъяснил.
Что к такому изъяснению, привел простой указатель this.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
17.01.2010, 02:21     Указатель this - как и когда его использовать #29
insideone, и к чему вы это написали....

Добавлено через 3 часа 48 минут
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Что к такому изъяснению, привел простой указатель this.
Ни к чему оно не привело... так как insideone даже не понял на какой вопрос дал ответ...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 18:47     Указатель this - как и когда его использовать #30
2 ISergey ну почему же. я дал ответ на свой же вопрос: есть ли разница в производительности кода возвращающего MyClass& и возвращающего PrimitiveClass&. Ответ - нет. Цитаты которые меня подтолкнули сделать такие выводы я вынес для того чтобы это не казалось моей выдумкой.

С другой стороны в приведенном вами примере возврат char& грамотнее с функциональной точки зрения, т.к. это непосредственно выдает этот символ на присваивание и к тому же освобождает перегрузку оператора = и становится ненужной переменная index. Да, ваш код хорош, а мой был крив, больше не будет =) спасибо за опыт))

И в общем и целом это полезный пример как неправильно было возвращать this ))) лучше было бы написать перегрузку = и если объект сравнивается с объектом того же типа сравнить адрес входного объекта с this чтобы избежать присваивания себе. Хотя вроде выше упоминалось
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 18:51     Указатель this - как и когда его использовать #31
Цитата Сообщение от insideone Посмотреть сообщение
а принципиально возвращать char& или qstring&
в operator[] возвращать qstring& для объекта qstring - неправильно.
ведь индекс указывает на символ - вот он и возвращается.
***
Цитата Сообщение от insideone Посмотреть сообщение
есть ли разница в производительности кода
забудь о производительности. поверь, ты не умней оптимизатора кода(программы). там, где ты думаешь, что оптимизируешь - ты можешь только мешать оптимизатору.
алгоритм такой написания прог:
1) напиши, чтобы работало
2) если медленно работает - запусти профайлер
3) перепиши участки кода, которые дольше всего выполняются по времени (исходя из отчёта профайлера)
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 18:56     Указатель this - как и когда его использовать #32
в operator[] возвращать qstring& для объекта qstring - неправильно.
ведь индекс указывает на символ - вот он и возвращается.
Ну я понял, что я совершил логическую ошибку, но неправильно это несколько не то слово. Скорее криво или нецелесообразно.

забудь о производительности. поверь, ты не умней оптимизатора кода(программы).
Это точно, компиляторам поклон большой (в смысле его разработчикам). Раньше вон вручную вбивали двочный код. В принципе щас вообще на скорость забивают пока не тормозит, но мне почему то этот подход не нравится, это как то легкомысленно) Все таки надо руководствоваться твоих хорошим алгоритмом, но я все таки буду стараться побольше думать перед тем как написать чтобы сразу быстро работало.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 19:12     Указатель this - как и когда его использовать #33
4 пункт добавлю: перейти к пункту 2
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 19:25     Указатель this - как и когда его использовать #34
ок. есть допустим код, который говорит, представлено ли число в массиве.
как ты его оптимизируешь, оптимизатор?

C++
1
2
3
4
5
6
7
8
9
10
11
bool exist(int searchedValue, int *arr, int size)
{
   for (int i = 0; i != size; ++i)
    if (arr[i] == searchedValue) return true;
  return false;
}
int main() {
  int arr[] = {1, 3, 5, 7, 9, 17, 99, 100, 1000, 100000};
  bool result = exist(99, arr, sizeof(arr) / sizeof(*arr));
  
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.01.2010, 19:38     Указатель this - как и когда его использовать #35
Можно использовать вместо линейного поиска линейный поиск с барьером.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Поиск ключа в массиве
// Функция возвращает индекс искомого элемента
// В случае отсутствия искомого элемента возвращает -1.
int Find(int* arr, int count, int key ) {
  int temp=arr[count-1];
  arr[count-1]=key;
 
  int i;
  for (i=0; arr[i] != key ; ++i)
    ;
 
  arr[count-1]=temp;
 
  return arr[i] == key ? i : -1;
}
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 19:41     Указатель this - как и когда его использовать #36
Именно такой?
C++
1
2
3
4
int main() {
  int arr[] = {1, 3, 5, 7, 9, 17, 99, 100, 1000, 100000};
  bool result = true;
}
Тогда так :-D Простой код простой ответ)) Ну да, кое что оптимизировать нет смысла. Ну и для экономии памяти нужно взять наименьший по кол-ву байт целочисленный тип. И все таки тема с this исчерпала себя =)
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 20:27     Указатель this - как и когда его использовать #37
Цитата Сообщение от insideone Посмотреть сообщение
Ну да, кое что оптимизировать нет смысла
если массив упорядоченный - то можно использовать std::binary_search
The complexity of the algorithm is logarithmic for random-access iterators
если же неупорядоченный массив - то всё-равно лучше использовать std::find чем свой велосипед
sinobithug
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 24
25.06.2014, 22:22     Указатель this - как и когда его использовать #38
C++
1
2
3
4
5
6
7
8
class Foo{
public:
  Foo* GetThis()
  {
    // Возвращаем указатель на данный объект
    return this;
  }
};
А как тут вызвать функцию GetThis()?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
25.06.2014, 23:41     Указатель this - как и когда его использовать #39
Цитата Сообщение от insideone Посмотреть сообщение
Ну и для экономии памяти нужно взять наименьший по кол-ву байт целочисленный тип
Это большое заблуждение.
"Преждевременная оптимизация - корень всех зол", еще Дейкстра говорил, а Кнут цитировал.

Во-первых, очень советую погуглить про выравнивание, про то как оно сказывается на производительности.
Ну и во-вторых, если уж очень хочется оптимизировать (ну или мы пишем под хардкорный embedded с 16кб памяти и простым как три копейки процессором), то вместо того, чтобы гадать про оптимизацию, советую смотреть код, который генерирует компилятор и анализировать его.

И я сейчас не про догмы говорю, а наоборот. Установка "всегда по умолчанию беру наименьший тип данных для экономии памяти" - не верна. Нужно каждый раз разбираться в целесообразности того или иного решения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2015, 11:37     Указатель this - как и когда его использовать
Еще ссылки по теме:

Зачем использовать Указатель на указатель? C++
Как использовать указатель на переменную во входящем параметре функции? C++
Когда использовать WinAPI, а когда функции языка? C++

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

Или воспользуйтесь поиском по форуму:
Derrt
0 / 0 / 0
Регистрация: 29.11.2014
Сообщений: 64
06.05.2015, 11:37     Указатель this - как и когда его использовать #40
Цитата Сообщение от Genius Ignat Посмотреть сообщение
C++ (Qt)
1
2
void MyClass::set(int a){
this->a=a; * * *//полю класса присваиваются данные, определение кому присваивается.
я так понял, это обращение к статическому полю? (может вопрос дурной, но я недавно начал изучать С++, так что сорри)
Yandex
Объявления
06.05.2015, 11:37     Указатель this - как и когда его использовать
Ответ Создать тему
Опции темы

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