Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 22.03.2020
Сообщений: 131

ДЛЯ чего используется this-> в конструкторе

29.05.2020, 13:45. Показов 6085. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ДЛЯ чего используется this-> в конструкторе и на что он указывает
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2020, 13:45
Ответы с готовыми решениями:

Для чего используется out
Здравствуйте!!! Не могу понять для чего используется в программе out ? Задание: Дан массив размером n×n, элементы которого целые...

Для чего используется eventfd
Здравствуйте! Изучаю событийно-ориентированное программирование в Linux, нашел такой системный вызоа как eventfd, но не доконца понятно...

Для чего в коде используется >>>
Здравствуйте. изучаю по самоучителю python 3.7 в коде попались символы >>> - для чего они используются. не могу найти в...

46
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.05.2020, 15:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
у меня поледняя защита лаб дистанционно,у меня нет времени
Добавлено через 59 секунд
так,пожалуйста,точно на какое поле указывает this в конструкторе
this вообще на поле не указывает. Он указывает на объект. Этот указатель гарантирует правильный доступ к полям, и это всё на что можно рассчитывать. То что для очень простых структур он совпадает с адресом первого поля не является общим правилом для всех объектов. В конструкторах используют для разрешения конфликта имён аргументов и полей, а так же для инициализации указателя на себя, если таковой имеется (бывает что полем делают указатель на базовый класс, например).
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.05.2020, 16:00
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
ДЛЯ чего используется this-> в конструкторе и на что он указывает
В оригинале:

The keyword this names a pointer to the object for which a non-static member function is invoked
or a non-static data member’s initializer is evaluated.
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 16:01
zayats80888, здесь никому не нужен твой высер, акстись. Этот пример не является практически используемым, ибо в этом просто нет смысла, он существует лишь для того, чтобы доказать эквивалентность, показать, что из себя представляет объект класса. Но раз уж речь зашла о неопределённом поведении, то давай, докажи, что это действительно так, пришли мне ссылку на онлайн-компилятор, который не выведет установленное через указатель значение из-за твоего strict-aliasing. Я уж не буду говорить про существование volatile и ассемблерных вставок, позволяющих обойти все твои ограничения, правила, стандарты и прочее. Твои слова не значат ровным счётом ничего, пока ты их не докажешь, так что давай, дерзай. И насколько же нужно быть очевидным, чтобы добавить свои важнецкие замечания к коду, ломающего ключевой механизм языка, на что же следует рассчитывать, применяя его, на то, что это позволительно стандартами? Увы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
class a {
    private:
        int data;
    public:
        void get () {
            printf("%d\n",data);
        }
};
 
int main (int argc, char *argv[], char *envp[]) {
    a object;
    int *hack = reinterpret_cast <int*> (&object);
    *hack = 666;
    object.get();
    return 0;
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.05.2020, 16:03
FaceProgrammist, и еще http://eel.is/c++draft/class.this
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 16:05
И я не спорю с тем, что это действительно UB, ибо, как я сказал выше, обход инкапсуляции не может быть частью стандартов.
Но всё равно найди мне компилятор, который сделает иначе, чтобы доказать, что в практических условиях результат не всегда один и тот же.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
29.05.2020, 16:14
Цитата Сообщение от Mightsoul Посмотреть сообщение
обход инкапсуляции не может быть частью стандартов
Откуда тебе знать, ты же 0 в стандартах.
0
151 / 103 / 49
Регистрация: 21.11.2019
Сообщений: 285
29.05.2020, 16:16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
class A
{
public:
    void printThis(){ cout<<this; }
};
 
int main()
{
    A a1;
    cout << &a1<<endl;
    a1.printThis();
return 0;
}
Мои 5 копеек, может поможет в понимании.
Комментарий к коду - если вывести значение this из функции объекта а1, то его значение совпадает с адресом а1, следовательно this указывает на объект а1, который вызывает функцию, конструктор, деструктор и т.д.
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 16:17
Здравый смысл подсказывает.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
29.05.2020, 16:20
Цитата Сообщение от Mightsoul Посмотреть сообщение
Здравый смысл подсказывает.
Понятно...
Как часто "здравый смысл" тебе о чём-то подсказывает?
"здравый смысл" только подсказывает, или ты его ещё видишь?
1
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 16:21
А что, ты можешь доказать обратное? Или кроме слов ничего?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
29.05.2020, 18:53
Цитата Сообщение от Mightsoul Посмотреть сообщение
он существует лишь для того, чтобы доказать эквивалентность, показать, что из себя представляет объект класса
Лично я не вижу ничего плохого, чтобы что-то объяснять с этой позиции, но при этом очень важно делать несколько оговорок, которые вы не сделали. В данном случае именно отсутствие этих оговорок, ИМХО, и привели к этим "важнецким замечаниям". На всякий случай процитирую то, о чем я говорю:
Цитата Сообщение от zayats80888 Посмотреть сообщение
такое преобразование прокатит только для pointer-interconvertible объектов.
В данном случае истинность этого утверждения легко доказать просто добавив virtual к функции get в вашем примере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
class a {
    private:
        int data;
    public:
        virtual void get () {
            printf("%d\n",data);
        }
};
 
int main () {
    a object;
    int *hack = reinterpret_cast <int*> (&object);
    *hack = 666;
    object.get();
    return 0;
}
После чего пример перестанет работать ожидаемым образом, т.к. свойство pointer-interconvertible теряется.
Онлайн пример с диагностикой в GCC: https://rextester.com/GYW49209
Онлайн пример с диагностикой в Clang: https://rextester.com/IGKYX16507
Онлайн пример для VC++: https://rextester.com/IIMX59211

Ссылки на стандарт даст кто-нибудь еще.
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 19:19
Во-первых, вы изменили код, что делать было нельзя, во-вторых, делать метод виртуальным, не имея производных классов - глупо, в третьих, результат другой лишь из-за того, что первым членом полиморфных классов является указатель на таблицу виртуальных методов. Изменив смещение, вернётся прежний результат.

Добавлено через 4 минуты
C++
1
*(hack+2) = 666;
И во всех трёх компиляторах, присланными вами, выводится 666.

...

Добавлено через 5 минут
И да, у этого примера чисто академический характер. Я не призываю к тому, чтобы использовать это.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
29.05.2020, 19:25
Цитата Сообщение от Mightsoul Посмотреть сообщение
во-вторых, делать метод виртуальным, не имея производных классов - глупо,
Бессмысленное замечание. Если класс не объявлен как final, то не существует абсолютно никакого способа сказать, если ли у него в программе производные классы или нет. То есть даже такого сочетания слов - "не имея производных классов" - тут никак появиться не может.

Цитата Сообщение от Mightsoul Посмотреть сообщение
И во всех трёх компиляторах, присланными вами, выводится 666.
... по чистой случайности. Это бессмысленный эксперимент их области анекдота про диссертацию Василия Ивановича.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
29.05.2020, 19:33
Цитата Сообщение от Mightsoul Посмотреть сообщение
Во-первых, вы изменили код, что делать было нельзя
Кто сказал?

Цитата Сообщение от Mightsoul Посмотреть сообщение
не имея производных классов - глупо
Это не имеет отношения к теме.

Цитата Сообщение от Mightsoul Посмотреть сообщение
результат другой лишь из-за того, что первым членом полиморфных классов является указатель на таблицу виртуальных методов.
Вот именно об этом вы и должны были оговориться в вашем сообщении. Я лишь поясняю причины замечаний. Причины в том, что ваши умолчания работают не в любых ситуациях. Со стороны ТС это не очевидно.

Добавлено через 6 минут
Цитата Сообщение от Mightsoul Посмотреть сообщение
И да, у этого примера чисто академический характер.
Академический или нет, а тему вы не раскрыли. Поэтому и возмущаться, что вам делают замечания, как вы говорите, глупо.
Еще раз повторю, что раскрывать вопрос с точки зрения размещения объектов в памяти можно, и лично я не вижу в этом ничего плохого. Но замечания вам делают совершенно справедливо, потому что вы очень много недоговариваете.

Цитата Сообщение от Mightsoul Посмотреть сообщение
*(hack+2) = 666;
Вот опять. А объяснять ТС почему именно +2 вы мне предлагаете?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.05.2020, 19:52
Цитата Сообщение от Mightsoul Посмотреть сообщение
фактически, на первый член этого объекта.
это - не факт.
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 20:11
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то не существует абсолютно никакого способа сказать, если ли у него в программе производные классы или нет.
А dynamic_cast на что? Вы выдумываете мою неправоту в другом вопросе, хотя речь не об этом, если виртуальный метод не переопределяется, то и нет смысла в использовании данного механизма. Если не нужно сделать абстракцию полиморфной, разумеется, но здесь это не нужно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
... по чистой случайности. Это бессмысленный эксперимент их области анекдота про диссертацию Василия Ивановича.
"Случайности не случайны" (с).
Но раз вы считаете это чистой случайностью (в десятках онлайн-компиляторах), то пожалуйста, докажите, что результат может быть другим, без изменения кода, ибо иначе, ваши слова не имеют никакого значения. Или вы только говорить про UB и можете? UB, UB, UB.
Цитата Сообщение от DrOffset Посмотреть сообщение
Кто сказал?
Это подразумевалось неявно, ибо проверялось то, как разные компиляторы относятся к одному и тому же коду.
Цитата Сообщение от hoggy Посмотреть сообщение
это - не факт.
Пожалуй, методы тоже члены, и они могут быть объявлены раньше свойств.

Добавлено через 5 минут
Случайность не может быть абсолютной, поэтому, если вы правы, должен быть компилятор, который не выведет 666 без изменения кода.

Добавлено через 26 секунд
А иначе, ваши разговоры - пустая болтовня ни о чём.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
29.05.2020, 20:38
Цитата Сообщение от Mightsoul Посмотреть сообщение
А dynamic_cast на что? Вы выдумываете мою неправоту в другом вопросе, хотя речь не об этом, если виртуальный метод не переопределяется, то и нет смысла в использовании данного механизма.
Я не знаю, каким боком и при чем здесь dynamic_cast. Я повторю еще раз: если ваш класс не объявлен final, то вы не знаете и никак не можете знать, есть ли у него наследники и переопределяется ли где-нибудь этот виртуальный метод. Это вопрос находится за пределами вашего контроля.

Цитата Сообщение от Mightsoul Посмотреть сообщение
Но раз вы считаете это чистой случайностью (в десятках онлайн-компиляторах), то пожалуйста, докажите, что результат может быть другим, без изменения кода, ибо иначе, ваши слова не имеют никакого значения.
Исчерпывающее доказательство тут уже приводилось: в стандарте языка ясно сказано, что данный код приводит к неопределенному поведению. Всем сразу очевидна исчерпывающесть (я изобрел слово?) и непререкаемость этого доказательства.

А ваши "десятки онлайн-компиляторов" (смех в зале) - это не более чем детские эксперименты с тараканами. К чему это здесь, и почему вы решили что эти левые эксперименты имеют какое-то значение - совершенно не ясно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.05.2020, 20:54
Цитата Сообщение от Mightsoul Посмотреть сообщение
Пожалуй, методы тоже члены, и они могут быть объявлены раньше свойств.
и... к чему ты сейчас об этом написал?

порядок объявления методов не оказывает на содержимое объектов никакого влияния.
поэтому, он он никак не влияет на то, что именно может находиться по адресу this
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.05.2020, 20:57
Mightsoul,
короче суть такая, this не обязан указывать на первое поле объекта, но обычно он это делает, а все остальное как ты говоришь
Цитата Сообщение от Mightsoul Посмотреть сообщение
пустая болтовня ни о чём.
0
El. Psy. Congroo.
 Аватар для Mightsoul
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
29.05.2020, 21:13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то вы не знаете и никак не можете знать, есть ли у него наследники и переопределяется ли где-нибудь этот виртуальный метод. Это вопрос находится за пределами вашего контроля.
Можете раскрыть свою причинно-следственную связь, а то я не понимаю? Вы исходный код читать не можете? В нём всё это и определяется.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исчерпывающее доказательство тут уже приводилось: в стандарте языка ясно сказано, что данный код приводит к неопределенному поведению. Всем сразу очевидна исчерпывающесть (я изобрел слово?) и непререкаемость этого доказательства.
Цитата Сообщение от Mightsoul Посмотреть сообщение
И я не спорю с тем, что это действительно UB, ибо, как я сказал выше, обход инкапсуляции не может быть частью стандартов.
Но всё равно найди мне компилятор, который сделает иначе, чтобы доказать, что в практических условиях результат не всегда один и тот же.
Я и сам об этом говорил вообще-то.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А ваши "десятки онлайн-компиляторов" (смех в зале) - это не более чем детские эксперименты с тараканами. К чему это здесь, и почему вы решили что эти левые эксперименты имеют какое-то значение - совершенно не ясно.
Так я же говорю, опровергни суть вещей, измени мировой порядок, вот вы говорите, что это чистая случайность, так покажите мне, где это код с неопределённым поведением не будет иметь никаких случайностей. Раз это "левые" эксперименты, то покажите, как выглядят "правые", я не понимаю, в чём суть ваших изъявлений, если я не отрицаю, что это UB?

Добавлено через 8 минут
Цитата Сообщение от hoggy Посмотреть сообщение
и... к чему ты сейчас об этом написал?
Это очередная абстракция, но в общем случае, this всегда ассоциирован с адресом какой-то части фрагмента данных этого объекта.
Цитата Сообщение от hoggy Посмотреть сообщение
порядок объявления методов не оказывает на содержимое объектов никакого влияния.
Я знаю, имелось ввиду, что первым членом будет метод, но значение this от этого не изменится.

Добавлено через 5 минут
Я прислал пример, чтобы объяснить значение указателя this. Из всех, только DrOffset выразил конструктивную критику по существу, у остальных, как будто бы, фантомные войны со мной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.05.2020, 21:13

Для чего используется Distinct()
для чего используется Distinct()?

Для чего используется DLL?
исходники кода написанного на C++ хранятся в DLL верно?? Для чего используется DLL?? Добавлено через 2 минуты вернее не исходники а...

Для чего используется Close(F)?
Это закрытие файла, что может быть если не выполнить это закрытие?

Для чего используется директива using
A) Только для объявления пространства имен B) Только для освобождения управляемых ресурсов C) Только для освобождения неуправляемых...

Для чего используется Expression
Здравствуйте! Недавно наткнулся в чужом коде на ключевое слово Expression и не могу до сих пор догнать, для чего это нужно :wall:. С...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru