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

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

13.03.2017, 13:39. Показов 4717. Ответов 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 / 1574 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru