Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515

Использование this в языке С++

13.03.2017, 13:39. Показов 4819. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто работал с кодом this набросайте пожалуйста поучительные примеры кодов.
А также набросайте коды, где без this вообще не обойтись.

Просто для общего развития хочу понять на что способен this.

Добавлено через 16 минут
Начинающие программисты задаются вопросом. Зачем использовать this , когда и без this Работает также.
Неужели этот this нужен только для того, чтобы отделить глобальные переменные от внутриблочных или внутриклассных?
То есть this указывает явно на использование внутриблочных или внутриклассных переменных.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2017, 13:39
Ответы с готовыми решениями:

GeoTiff - примеры ее использования на языке c , желательно на русском языке
Добрый вечер. Дана курсовая с использованием библиотеки GeoTiff. Подскажите где можно прочитать про нее, и найти примеры ее использования...

Вычислить кусочно-линейную функцию
Использование условных операторов в языке Ассемблера. y=2*{x}^{3}, при x<0 y=(x-5)/x, при x>=0 и составить блок схему. ...

Использование оператора Case в разветвляющемся вычислительном процессе в языке Pascal
Преобразовать целое число N в зависимости от величины остатка от его деления на 17 следующим образом:  если N mod 17=0, то N=0; ...

31
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.03.2017, 10:31
Студворк — интернет-сервис помощи студентам
hoggy,
Немного не ясен сам код (смысл понятен но код нет)
C++
1
void* proxy = reinterpret_cast<void*>(&m);
зачем здесь нужно брать адрес если m и так является указателем? интересная магия, используется указатель на указатель который кастуется к обычному указателю

Так же не понятно почему в классе объявлено два указателя на метод
И еще возникает вопрос как обратиться к этому this-у который передался не явно
Или как бы пример что он передается но достучаться нельзя?

Конечный результат понятен но до логика выполнения не очень
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
14.03.2017, 10:36
sys_beginner, ну так вы попробуйте убрать эту строку ... .
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.03.2017, 10:49
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну так вы попробуйте убрать эту строку ... .
Зачем? Это же не объяснит мне логику выполнения

Добавлено через 3 минуты
И не ответит на вопрос про переданный псевдо-this
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
14.03.2017, 11:01
Покажу где лучше this не использовать.

Плохой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct _1C
{
    string Tag;
    string Rus;
    string Eng;
    _1C(string Tag, string Rus, string Eng)
    {
        (*this).Tag = Tag;
        (*this).Rus = Rus;
        (*this).Eng = Eng;
    }
};
Хороший код:
C++
1
2
3
4
5
6
7
struct _1C
{
    string Tag;
    string Rus;
    string Eng;
    _1C(const std::string& Tag, const std::string& Rus, const std::string& Eng, const std::string& Rus) : Tag(Tag), Rus(Rus), Eng(Eng) { }
};
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.03.2017, 11:49
Цитата Сообщение от eXPonent Посмотреть сообщение
Хороший код:
Всё также плохой код.
1. Зачем-то дублируется параметр Rus
2. Название структуры с нижнего подчёркивания
3. Названия параметров совпадают с названием полей
4. Названия полей с большой буквы обычно не пишут (это вопрос к Code Style)
5. Неизвестно зачем вообще нужен конструктор для структуры. При необходимости можно присваивать поля напрямую или использовать список инициализации.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.03.2017, 12:22
Цитата Сообщение от MrGluck Посмотреть сообщение
Неизвестно зачем вообще нужен конструктор для структуры.
Конструктор же нужен не только для обычного присваивания
Например, на основании параметра конструктора может понадобится открыть файл внутри конструктора и возможно сделать некоторые проверки, а в конце закрыть файл в деструкторе
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.03.2017, 12:34
sys_beginner, здесь приведён конкретный пример.

Добавлено через 1 минуту
А вообще, для сложных конструкторов я бы скорее всего выбрал класс. Структуру использую прежде всего для объединения данных с использованием осмысленных названий.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.03.2017, 12:38
Цитата Сообщение от sys_beginner Посмотреть сообщение
зачем здесь нужно брать адрес если m и так является указателем?
тут вроде бы по-русски написано, не?

C++
1
2
3
4
    //для этого возьмем адрес функции-члена таким образом,
    //что бы компилятор забыл изначальный тип функции-члена
    //это позволит обойти защиту компилятора при некорректном 
    //с точки зрения компилятора преобразовании типов функции-члена к функции
указатель на функцию член нельзя просто так взять,
и привести указателю на функцию.
строго говоря - так делать вообще нельзя.
этот хак был нужен исключительно для примера.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Так же не понятно почему в классе объявлено два указателя на метод
мне тоже не понятно.
где вы вам нашли хотя бы один.
вы вообще куда смотрите?

Цитата Сообщение от sys_beginner Посмотреть сообщение
И еще возникает вопрос как обратиться к этому this-у который передался не явно
this->foo(10);

Цитата Сообщение от sys_beginner Посмотреть сообщение
Или как бы пример что он передается но достучаться нельзя?
что за бред?

Цитата Сообщение от sys_beginner Посмотреть сообщение
Конечный результат понятен но до логика выполнения не очень
такое чувство, что вам вообще ничего не понятно
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.03.2017, 12:51
Цитата Сообщение от hoggy Посмотреть сообщение
тут вроде бы по-русски написано, не?
Да. Но поверхностно

Цитата Сообщение от hoggy Посмотреть сообщение
вы вообще куда смотрите?
В main)) я ошибся, речь о указателях в main а не классе

Цитата Сообщение от hoggy Посмотреть сообщение
что за бред?
Где тут бред? f(&ex,10); вот ваш код который вызывает foo. При вызове передается адрес объекта для которого вызвана эта функция. Вот мне интересно как в вашем примере достучаться до этого указателя

Цитата Сообщение от hoggy Посмотреть сообщение
такое чувство, что вам вообще ничего не понятно
Ощущение обманчивое

Цитата Сообщение от MrGluck Посмотреть сообщение
А вообще, для сложных конструкторов я бы скорее всего выбрал класс.
Я лично выбираю структуры только в кодах-примерах потому что лишний раз public писать не нужно
0
14.03.2017, 13:47

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
тут вроде бы по-русски написано, не?
Цитата Сообщение от sys_beginner Посмотреть сообщение
Да. Но поверхностно
hoggy - учитель поверхностного-русского :umnik:

0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
15.03.2017, 01:36
Цитата Сообщение от infobos Посмотреть сообщение
Зачем использовать this , когда и без this Работает также
Простенький пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class Scalar>
struct T2DPoint {
    Scalar x = 0;
    Scalar y = 0;
    T2DPoint(Scalar ax, Scalar ay) :x(ax), y(ay) {};
 
    template<class RT>
    T2DPoint(const T2DPoint<RT>& r) :x(r.x), y(r.y) {};
 
    template<class RT>
    T2DPoint& operator +=(const T2DPoint<RT>& r) { x += r.x; y += r.y; return *this; };
    template<class RT>
    T2DPoint& operator -=(const T2DPoint<RT>& r) { x -= r.x; y -= r.y; return *this; };
};
Добавлено через 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
25
26
class TComponent {
private:
    TComponent *FOwner=nullptr; 
    vector<TComponent*> FComponents;
    bool Destroying=false;
    void ComponentCreated(TComponent* Component){
              FComponents.push_back(Component);
        };
    void ComponentDeleted(TComponent* Component){
            remove_if(FComponents.begin(), FComponents.end(), [Component](TComponent *Item) -> bool {return Item == Component; });
        };  
    WideString FName;
public:
    TComponent(TComponent *aOwner):FOwner(aOwner) { if (Owner) Owner->ComponentCreated(this); };
    TComponent(const TComponent& Other) = delete;
    TComponent& operator = (const TComponent& Other) = delete;
    virtual ~TComponent(){
            Destroying = true;
            for (auto Component : FComponents) delete Component;
            Destroying = false;
            FComponents.clear();
           if (Owner && !Owner->Destroying) Owner->ComponentDeleted(this);
        };
    TComponent* GetOwner() { return FOwner; };
    __declspec(property(get = GetOwner)) TComponent* Owner;
};
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.03.2017, 12:23
Цитата Сообщение от notAll Посмотреть сообщение
Вот пример где 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
#include <iostream>
#include <string>
 
std::string name = "Global Name";
 
template <typename T> struct Base {  T name = ""; };
 
template <typename T> struct Derived : Base<T>
{
    using parent = Base<T>;
    
    void setName1(const std::string& n) {name = n;}
    void setName2(const std::string& n) {this->name = n;}
    void setName3(const std::string& n) {parent::name = n;}
};
 
int main()
{
    std::cout << "Global name: " << name << "\n";
    Derived<std::string> d;
    d.setName1("Derived Name");
    std::cout << "Global name: " << name << "\n";
    std::cout << "d.name: " << d.name << "\n";
 
    d.setName2("Derived Name");
    std::cout << "d.name: " << d.name << "\n";
    
    d.setName3("Derived Name");
    std::cout << "d.name: " << d.name << "\n";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2017, 12:23
Помогаю со студенческими работами здесь

Что даёт использование классов (и шире - ООП) в языке программирования С++?
Понял что такое классы. Но как я ими могу пользоваться ? Допустим. Я создал программу для ввода банковских реквизитов. Я могу в...

Что даёт использование классов (и шире - ООП) в языке программирования С++? (2)
Продолжение темы

как этот код на языке с++ будет выглядить на языке php?
#include &lt;iostream&gt; using namespace std; const int LEN = 80; class instrument{ private: char name; char...

Конвертер для перевода программ на языке PHP в текст программы на языке Assembler
Всем привет. Как можно реализовать такую задачу? Разработать конвертор в языке Assembler для перевода программ на языке PHP в текст...

Создать шуточную программу, которая при вводе имени на русском языке выдаст, как оно звучит на японском языке
Такая задача была сегодня на программировании. Создать шуточную программу, которая при вводе имени на русском языке выдаст, как оно звучит...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru