кривого выделения памяти конструктором (из-за того, что он для всех объектов память скопом выделяет).
В итоге конструктор В С++11 превратился в странную структуру с пустыми фигурными скобками на конце:
RatedPlayer::RatedPlayer(unsigned int r, const TableTennisPlayer & tp)
: TableTennisPlayer(tp), rating(r) {}
Почему бы не перенести этот member list внутрь скобок и не инициализировать все там, раз уж в листе все и инициализируется?
Пустые скобки на конце — это скобки тела конструктора
Я понимаю, но почему не сделать всю инициализацию внутри member list?
Она и так там вся
именно. так и перенесите ее внутрь скобок и получите нормально выглядящий конструктор.
> которую ввели из-за кривого выделения памяти конструктором (из-за того, что он для всех объектов память скопом выделяет) ЩИТО? конструктор не выделяет память
Он и так нормально выглядит
прата писал что выделяет. Что типа память выделяется до { и поэтому внутри {} инициализировать cont уже поздно.
> Почему бы не перенести этот member list внутрь скобок и не инициализировать все там, раз уж в листе все и инициализируется? потому что при входе в тело конструктора инициализация уже должна была произойти?
потому, что конструкторы членов класса например будут вызваны до тела конструктора
Так а разве не для инициализации объектов класса конструктор и нужен?
Так конструктор и нужен для вызова конструкторов членов класса. Зачем это вне его делать?
это делается ДО вызова тела конструктора
А что тогда должно быть в теле конструктора?
в нём ты настраиваешь свой объект до состояния готовности к работе, условно
Логика по инициализации объекта самого класса, а не его полей
я извиняюсь, а что есть у объекта класса кроме его полей?
Возможное поведение и конструктор с диструктопгм
ну вот например (не скажу, что это сильно эталонный код) https://github.com/pioneerspacesim/pioneer/blob/8052a5903a2c67fa641f5eb2852a0a4277d63795/src/SystemView.cpp#L50
Ну вообще же бред... Полное непонимание языка.
Это не будет инициализацией и она не будет однозначной
Можно ссылочку на текст?
https://pastebin.com/ZHgtdKMg
Это же я Насте писал...
Логика какая-то есть.
ну логика же не принадлежит объекту, если я ничего не путаю, она общая для всех объектов класса, ее не надо инициализировать, (если вы её в полях не прячете)
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.
Ну, 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) заставляет программу сначала выделить место для указанных четырёх членов-переменных. Тут не сказано, что конструктор что-то там выделяет, читай внимательно (ну или переходи на русский вариант книги)
Всмысле не конструктор? Они выделяется на этапе от вызова конструктора, до входа в тело конструктора.
Нет! Конструктор ВООБЩЕ НИКОГДА НЕ ЗАНИМАЕТСЯ ВЫДЕЛЕНИЕМ ИЛИ ОСВОБОЖДЕНИЕМ ПАМЯТИ ВООБЩЕ НИКОГДА! Такая объектная модель С++.
А что же тогда выделяет память после вот этого вызова: Queue::Queue(int qs) но до {
В этот момент память уже выделена полностью для объекта
ПРОГРАММА! Настя, именно потому что ты не понимаешь базовых вещей тебе и приходится постоянно всё объяснять. Перечисли классы памяти С++ (storage duration)
automatic, static, global,
ИЩО! ИЩО ДАВА! это мало!
там еще thread local, но я до него не добралась
Ну еще можно задать видимость чтоб переменная была видна из других файлов, но это не storage duration
Хотя ладно, скажи пожалуйста, кто и когда выделяет память под переменную с классом памяти global ? (если это объект класса, то как раз потом должен вызываться его конструктор)
она выделяется на этапе запуска программы
Конструктор к этому имеет отношение? Как думаешь?
Нет не имеет, так как об этой переменной известно в compile time
А если это динамический объект будет , как изменится ситуация с выделением памяти?
тогда она будет выделена в куче в момент вызова new ( или его обертки)
Мы же с этого начали.
Напоминаю, с чего началось
Да, конструктор уже получает this на выделенную область памяти. Ключевое что он получает не просто адрес в памяти (как я думала), а уже выделенный блок памяти.
Но теперь, допустим, конструктор получил область памяти на две переменные int. одна из них const, вторая - нет. так как у них разный тип доступа, то получается, что конструктор не один блок памяти получает?
const это не всегда значит что память реально нельзя менять
const для мемберов не работает в конструкторах и деструкторах. (в конструкторах не работает только в инициализаторах, в теле - уже работает)
что значит не работает в деструкторах?)
То, что он просто не const и его можно менять.
Спасибо. То есть конструктор это не просто функция, а функция с нестандартными правами доступа для const.
Ну да. Иначе как члены -то проинициализировать? И Деинициализировать?
я услышал это как конст для мемберов не работает в деструкторах, но это не так struct S { ~S() { i = 20; } const int i{}; };
Спасибо. В этом и была трудность понимания, когда мне говорили что конструктор это просто функция.
Это специальная функция, но со списком инициализации, где ты можешь произвести различные инициализации в том числе и const полей. В теле же конструктора такие же правила, как и в любой другой функции по доступу
Спасибо. Вот бы была книжка, в которй было так же понятно написано как здесь.
Это Прата! Которую ты читаешь на английском но не понимаешь! :)
Я понимаю прату ( только не когда он полунамеками говорит). А на русском ее куда как сложнее читать.
Ну так класс можно сделать и без конструктора
http://www.c-cpp.ru/books/peregruzka-new-u-delete
Ага, вот только конструктор в нём всё равно будет И может быть даже не один
Компилятор сгенерирует тебе дефолтный конструктор При определенных условиях он также может генерить копирующий и перемещающий конструкторы
>из-за того, что он для всех объектов память скопом выделяет что?
Чавой?? Как это без конструктора?
Не слушай его
Что там было, Настя опять с++ ругала?
Ну типа не объявлять его
Обсуждают сегодня