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

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

13.03.2017, 13:39. Показов 4921. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru