Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/382: Рейтинг темы: голосов - 382, средняя оценка - 4.92
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868

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

15.01.2010, 22:20. Показов 71514. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2010, 22:20
Ответы с готовыми решениями:

Тип void как возвращаемое значение функции: что он такое, зачем он нужен, где, когда и как его использовать?
Объясните пожалуйста про Void для оооочень далекого человека. Читаю книгу Шилдта, в принципе всё ясно, всё понимаю и пробую, но вот Void -...

Объяснить (с примерами) для чего нужен RTTI, как и когда его можно и нужно использовать
доброго времени суток. вопрос такой как я понял RTTI это свойсвто языка С++ которое было добавлено позднее его релиза, что бы...

Android NDK. Как пользоваться? Когда стоит использовать его вместо Android SDK?
Можно ли писать в нем готовые приложения Android?

40
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
15.01.2010, 23:31
Студворк — интернет-сервис помощи студентам
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;
}
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
15.01.2010, 23:32
Сообщение от Genius Ignat
malloc отдыхает
Значит отдыхает.
Ну что привязался.
Просто sizeof в параметре увидал.
Мысль проскользнула какая-то.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
15.01.2010, 23:40
2 ISergey Спасибо, а принципиально возвращать char& или qstring& ? Я имею ввиду производительность. И... применительно к многобайтовым кодировкам это будет работать так же?
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
16.01.2010, 00:00
принципиально возвращать char&
В данном случаи да..
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
16.01.2010, 00:08
В смысле... почему? Я думал что так передается ссылка т.е. адрес.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.01.2010, 12:11
Цитата Сообщение от insideone Посмотреть сообщение
В смысле... почему? Я думал что так передается ссылка т.е. адрес.
совет: почитай книгу по С++. много вопросов отпадёт.
рекомендую эту: isbn 5-8459-1121-4
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
16.01.2010, 16:34
Оператором new ты выделяешь 20 байт в памяти.
Далее возвращаешь указатель на этот кусок памяти, грубо говоря указатель - это адрес 1 элемента куска памяти.
И разве есть разница возвращать указатель на char или на свой класс? Это же все равно один адрес.
Книжку полистал
Когда же лучше использовать параметры-ссылки, а когда – параметры-указатели? В
конце концов, и те и другие позволяют функции модифицировать объекты, эффективно
передавать в функцию большие объекты типа класса. Что выбрать: объявить параметр
ссылкой или указателем?
Как было сказано в разделе 3.6, ссылка может быть один раз инициализирована
значением объекта, и впоследствии изменить ее нельзя. Указатель же в течение своей
жизни способен адресовать разные объекты или не адресовать вообще.
Поскольку указатель может содержать, а может и не содержать адрес какого-либо объекта, перед его использованием функция должна проверить, не равен ли он нулю.
Если параметр объявлен
как ссылка, функция получает его l-значение, а не копию. Лишнее копирование
исключается.
Т.е. вроде тут тоже описывается что разницы нет. Т.к. мне не нужно изменять адрес объекта (ведь это возвращаемое значение а не какая то переменная в функции) то можно возвращать что угодно. Ну и ладно. Вопрос был в том что не хуже ли по производительности возврат MyClass& чем PrimitiveClass& и я понял что нет.
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
16.01.2010, 17:18
insideone:
Круто изъяснил.
Что к такому изъяснению, привел простой указатель this.
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
17.01.2010, 02:21
insideone, и к чему вы это написали....

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

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

И в общем и целом это полезный пример как неправильно было возвращать this ))) лучше было бы написать перегрузку = и если объект сравнивается с объектом того же типа сравнить адрес входного объекта с this чтобы избежать присваивания себе. Хотя вроде выше упоминалось
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 18:51
Цитата Сообщение от insideone Посмотреть сообщение
а принципиально возвращать char& или qstring&
в operator[] возвращать qstring& для объекта qstring - неправильно.
ведь индекс указывает на символ - вот он и возвращается.
***
Цитата Сообщение от insideone Посмотреть сообщение
есть ли разница в производительности кода
забудь о производительности. поверь, ты не умней оптимизатора кода(программы). там, где ты думаешь, что оптимизируешь - ты можешь только мешать оптимизатору.
алгоритм такой написания прог:
1) напиши, чтобы работало
2) если медленно работает - запусти профайлер
3) перепиши участки кода, которые дольше всего выполняются по времени (исходя из отчёта профайлера)
2
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.01.2010, 18:56
в operator[] возвращать qstring& для объекта qstring - неправильно.
ведь индекс указывает на символ - вот он и возвращается.
Ну я понял, что я совершил логическую ошибку, но неправильно это несколько не то слово. Скорее криво или нецелесообразно.

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

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));
  
}
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
17.01.2010, 19:38
Можно использовать вместо линейного поиска линейный поиск с барьером.
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;
}
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.01.2010, 19:41
Именно такой?
C++
1
2
3
4
int main() {
  int arr[] = {1, 3, 5, 7, 9, 17, 99, 100, 1000, 100000};
  bool result = true;
}
Тогда так :-D Простой код простой ответ)) Ну да, кое что оптимизировать нет смысла. Ну и для экономии памяти нужно взять наименьший по кол-ву байт целочисленный тип. И все таки тема с this исчерпала себя =)
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 20:27
Цитата Сообщение от insideone Посмотреть сообщение
Ну да, кое что оптимизировать нет смысла
если массив упорядоченный - то можно использовать std::binary_search
The complexity of the algorithm is logarithmic for random-access iterators
если же неупорядоченный массив - то всё-равно лучше использовать std::find чем свой велосипед
0
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 24
25.06.2014, 22:22
C++
1
2
3
4
5
6
7
8
class Foo{
public:
  Foo* GetThis()
  {
    // Возвращаем указатель на данный объект
    return this;
  }
};
А как тут вызвать функцию GetThis()?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
25.06.2014, 23:41
Цитата Сообщение от insideone Посмотреть сообщение
Ну и для экономии памяти нужно взять наименьший по кол-ву байт целочисленный тип
Это большое заблуждение.
"Преждевременная оптимизация - корень всех зол", еще Дейкстра говорил, а Кнут цитировал.

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

И я сейчас не про догмы говорю, а наоборот. Установка "всегда по умолчанию беру наименьший тип данных для экономии памяти" - не верна. Нужно каждый раз разбираться в целесообразности того или иного решения.
0
0 / 0 / 0
Регистрация: 29.11.2014
Сообщений: 64
06.05.2015, 11:37
Цитата Сообщение от Genius Ignat Посмотреть сообщение
C++ (Qt)
1
2
void MyClass::set(int a){
this->a=a; * * *//полю класса присваиваются данные, определение кому присваивается.
я так понял, это обращение к статическому полю? (может вопрос дурной, но я недавно начал изучать С++, так что сорри)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2015, 11:37

Что такое yield return и когда его использовать?
Кто может простым языком объяснить, что есть yeild return и когда его юзать

Когда нужно использовать структуры, когда классы, а когда словарь?
Хеллоу. Не могу понять, когда, что, нужно использовать. Допустим мне нужно получить объект, который имеет список объектов. И...

Получить указатель из функции и использовать его в другой функции
Подскажите пожалуйста как из функции использовать в функции main указатель? пример void foo1() {u=sizeof(str1); int *l=&amp;u; }...

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

Что такое указатель на фаил в делфи, как его получить и с чем его готовить
У меня вопрос я получаю имя файла вот тут procedure TForm1.Button5Click(Sender: TObject); var f_name:string; begin ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru