170 похожих чатов

Еще вопрос. Вот есть member list initialization, которую ввели из-за

кривого выделения памяти конструктором (из-за того, что он для всех объектов память скопом выделяет).
В итоге конструктор В С++11 превратился в странную структуру с пустыми фигурными скобками на конце:
RatedPlayer::RatedPlayer(unsigned int r, const TableTennisPlayer & tp)
: TableTennisPlayer(tp), rating(r) {}
Почему бы не перенести этот member list внутрь скобок и не инициализировать все там, раз уж в листе все и инициализируется?

75 ответов

23 просмотра

Пустые скобки на конце — это скобки тела конструктора

Nastya-Medveda Автор вопроса
Danya🔥
Пустые скобки на конце — это скобки тела конструкт...

Я понимаю, но почему не сделать всю инициализацию внутри member list?

Nastya-Medveda Автор вопроса
Danya🔥
Она и так там вся

именно. так и перенесите ее внутрь скобок и получите нормально выглядящий конструктор.

> которую ввели из-за кривого выделения памяти конструктором (из-за того, что он для всех объектов память скопом выделяет) ЩИТО? конструктор не выделяет память

Nastya-Medveda Автор вопроса
Constantine Drozdov
> которую ввели из-за кривого выделения памяти кон...

прата писал что выделяет. Что типа память выделяется до { и поэтому внутри {} инициализировать cont уже поздно.

> Почему бы не перенести этот member list внутрь скобок и не инициализировать все там, раз уж в листе все и инициализируется? потому что при входе в тело конструктора инициализация уже должна была произойти?

Nastya Medveda
именно. так и перенесите ее внутрь скобок и получи...

потому, что конструкторы членов класса например будут вызваны до тела конструктора

Nastya-Medveda Автор вопроса
Constantine Drozdov
> Почему бы не перенести этот member list внутрь с...

Так а разве не для инициализации объектов класса конструктор и нужен?

Nastya-Medveda Автор вопроса
Denis P
потому, что конструкторы членов класса например бу...

Так конструктор и нужен для вызова конструкторов членов класса. Зачем это вне его делать?

Nastya Medveda
Так конструктор и нужен для вызова конструкторов ч...

это делается ДО вызова тела конструктора

Nastya-Medveda Автор вопроса
Denis P
это делается ДО вызова тела конструктора

А что тогда должно быть в теле конструктора?

Nastya Medveda
А что тогда должно быть в теле конструктора?

в нём ты настраиваешь свой объект до состояния готовности к работе, условно

Nastya Medveda
А что тогда должно быть в теле конструктора?

Логика по инициализации объекта самого класса, а не его полей

Danya🔥
Логика по инициализации объекта самого класса, а н...

я извиняюсь, а что есть у объекта класса кроме его полей?

anton
я извиняюсь, а что есть у объекта класса кроме его...

Возможное поведение и конструктор с диструктопгм

Nastya Medveda
именно!

ну вот например (не скажу, что это сильно эталонный код) https://github.com/pioneerspacesim/pioneer/blob/8052a5903a2c67fa641f5eb2852a0a4277d63795/src/SystemView.cpp#L50

Ну вообще же бред... Полное непонимание языка.

Nastya Medveda
именно. так и перенесите ее внутрь скобок и получи...

Это не будет инициализацией и она не будет однозначной

Ilya Zviagin
Логика какая-то есть.

ну логика же не принадлежит объекту, если я ничего не путаю, она общая для всех объектов класса, ее не надо инициализировать, (если вы её в полях не прячете)

Nastya-Medveda Автор вопроса
Ilya Zviagin
Можно ссылочку на текст?

Chapter 12. A queue class talking about initialization of a const int in a constructor The problem is that qsize is a const, so it can be initialized to a value, but it can’t be assigned a value. Conceptually, calling a constructor creates an object before the code within the brackets is executed. Thus, calling the Queue(int qs) constructor causes the program to first allocate space for the four member variables. Then program flow enters the brackets and uses ordinary assignment to place values into the allocated space. Therefore, if you want to initialize a const data member, you have to do so when the object is created before execution reaches the body of the constructor.

Nastya Medveda
Chapter 12. A queue class talking about initializa...

Ну, calling the Queue(int qs) constructor causes the program to first allocate space for the four member variables. the program to first allocate space for the four member variables. Программа выделяет место, а не конструктор. вызов конструктора Queue(int qs) заставляет программу сначала выделить место для указанных четырёх членов-переменных. Тут не сказано, что конструктор что-то там выделяет, читай внимательно (ну или переходи на русский вариант книги)

Nastya-Medveda Автор вопроса
Ilya Zviagin
Ну, calling the Queue(int qs) constructor causes ...

Всмысле не конструктор? Они выделяется на этапе от вызова конструктора, до входа в тело конструктора.

Nastya Medveda
Всмысле не конструктор? Они выделяется на этапе от...

Нет! Конструктор ВООБЩЕ НИКОГДА НЕ ЗАНИМАЕТСЯ ВЫДЕЛЕНИЕМ ИЛИ ОСВОБОЖДЕНИЕМ ПАМЯТИ ВООБЩЕ НИКОГДА! Такая объектная модель С++.

Nastya-Medveda Автор вопроса
Ilya Zviagin
Нет! Конструктор ВООБЩЕ НИКОГДА НЕ ЗАНИМАЕТСЯ ВЫД...

А что же тогда выделяет память после вот этого вызова: Queue::Queue(int qs) но до {

Nastya Medveda
А что же тогда выделяет память после вот этого вы...

В этот момент память уже выделена полностью для объекта

Nastya Medveda
А что же тогда выделяет память после вот этого вы...

ПРОГРАММА! Настя, именно потому что ты не понимаешь базовых вещей тебе и приходится постоянно всё объяснять. Перечисли классы памяти С++ (storage duration)

Nastya Medveda
automatic, static, global,

ИЩО! ИЩО ДАВА! это мало!

Nastya-Medveda Автор вопроса
Ilya Zviagin
ИЩО! ИЩО ДАВА! это мало!

там еще thread local, но я до него не добралась

Nastya-Medveda Автор вопроса
Ilya Zviagin
И ищо!

Ну еще можно задать видимость чтоб переменная была видна из других файлов, но это не storage duration

Nastya Medveda
automatic, static, global,

Хотя ладно, скажи пожалуйста, кто и когда выделяет память под переменную с классом памяти global ? (если это объект класса, то как раз потом должен вызываться его конструктор)

Nastya-Medveda Автор вопроса
Ilya Zviagin
Хотя ладно, скажи пожалуйста, кто и когда выделяет...

она выделяется на этапе запуска программы

Nastya Medveda
она выделяется на этапе запуска программы

Конструктор к этому имеет отношение? Как думаешь?

Nastya-Medveda Автор вопроса
Ilya Zviagin
Конструктор к этому имеет отношение? Как думаешь?

Нет не имеет, так как об этой переменной известно в compile time

Nastya Medveda
Нет не имеет, так как об этой переменной известно ...

А если это динамический объект будет , как изменится ситуация с выделением памяти?

Nastya-Medveda Автор вопроса
Ilya Zviagin
А если это динамический объект будет , как изменит...

тогда она будет выделена в куче в момент вызова new ( или его обертки)

Nastya-Medveda Автор вопроса
Ilya Zviagin
Напоминаю, с чего началось

Да, конструктор уже получает this на выделенную область памяти. Ключевое что он получает не просто адрес в памяти (как я думала), а уже выделенный блок памяти.

Nastya-Medveda Автор вопроса
Nastya Medveda
Да, конструктор уже получает this на выделенную о...

Но теперь, допустим, конструктор получил область памяти на две переменные int. одна из них const, вторая - нет. так как у них разный тип доступа, то получается, что конструктор не один блок памяти получает?

Nastya Medveda
Но теперь, допустим, конструктор получил область п...

const это не всегда значит что память реально нельзя менять

Nastya Medveda
Но теперь, допустим, конструктор получил область п...

const для мемберов не работает в конструкторах и деструкторах. (в конструкторах не работает только в инициализаторах, в теле - уже работает)

Ilya Zviagin
const для мемберов не работает в конструкторах и д...

что значит не работает в деструкторах?)

Denis P
что значит не работает в деструкторах?)

То, что он просто не const и его можно менять.

Nastya-Medveda Автор вопроса
Ilya Zviagin
const для мемберов не работает в конструкторах и д...

Спасибо. То есть конструктор это не просто функция, а функция с нестандартными правами доступа для const.

Nastya Medveda
Спасибо. То есть конструктор это не просто функция...

Ну да. Иначе как члены -то проинициализировать? И Деинициализировать?

Ilya Zviagin
То, что он просто не const и его можно менять.

я услышал это как конст для мемберов не работает в деструкторах, но это не так struct S { ~S() { i = 20; } const int i{}; };

Nastya-Medveda Автор вопроса
Ilya Zviagin
Ну да. Иначе как члены -то проинициализировать? И ...

Спасибо. В этом и была трудность понимания, когда мне говорили что конструктор это просто функция.

Nastya Medveda
Спасибо. В этом и была трудность понимания, когда ...

Это специальная функция, но со списком инициализации, где ты можешь произвести различные инициализации в том числе и const полей. В теле же конструктора такие же правила, как и в любой другой функции по доступу

Nastya-Medveda Автор вопроса
Anatoly Shirokov
Это специальная функция, но со списком инициализац...

Спасибо. Вот бы была книжка, в которй было так же понятно написано как здесь.

Nastya Medveda
Спасибо. Вот бы была книжка, в которй было так же ...

Это Прата! Которую ты читаешь на английском но не понимаешь! :)

Nastya-Medveda Автор вопроса
Ilya Zviagin
Это Прата! Которую ты читаешь на английском но не ...

Я понимаю прату ( только не когда он полунамеками говорит). А на русском ее куда как сложнее читать.

Nastya Medveda
А что же тогда выделяет память после вот этого вы...

Ну так класс можно сделать и без конструктора

Young Night
Ну так класс можно сделать и без конструктора

Ага, вот только конструктор в нём всё равно будет И может быть даже не один

Young Night
В плане

Компилятор сгенерирует тебе дефолтный конструктор При определенных условиях он также может генерить копирующий и перемещающий конструкторы

>из-за того, что он для всех объектов память скопом выделяет что?

Nastya-Medveda Автор вопроса
Danya🔥
Не слушай его

Что там было, Настя опять с++ ругала?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта