6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
|
|
1 | |
Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию?09.09.2012, 20:23. Показов 20899. Ответов 24
Метки нет (Все метки)
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию?
2) правильно ли утверждение,что списки инициализации можно заменить к.по умолчанию?
0
|
09.09.2012, 20:23 | |
Ответы с готовыми решениями:
24
Когда стоит использовать класс, а когда лучше обойтись без них? Когда нужно использовать &ссылки ,а когда *указатели? Когда использовать WinAPI, а когда функции языка? Когда использовать указатели, а когда передачу по ссылке? |
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
09.09.2012, 20:32 | 2 |
Уточните-ка, какие именно списки инициализации вы имеете ввиду? Списки инициализации объектов? Или список инициализации конструктора?
0
|
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
|
|||||||||||
09.09.2012, 20:43 [ТС] | 3 | ||||||||||
э..Наверное списки инициализации объектов...
Вот это я имею в виду:
2)Вот инициализация конструктора,да ?:
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
09.09.2012, 20:51 | 4 | |||||
Нет, всё это списки инициализации конструкторов. Список инициализации объекта вот, например:
0
|
Комп_Оратор)
|
|
09.09.2012, 20:57 | 5 |
Список инициализации, например, - единственный выход для инициализации не статических констант класса. Их можно объявить, в теле объявления (сигнатуре) класса, а определить в конструкторе, применив инициализацию списком.
зы для случая приведенного Вами, можно легко провести инициализацию в теле конструктора присвоением. И компилятор это примет. Тут нет разницы. А вот константу так инициализировать не даст.)
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
09.09.2012, 21:03 | 6 |
IGPIGP, да банальнейший пример - вызов конкретного конструктора базового класса можно сделать только в списке инициализации.
1
|
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
|
||||||
09.09.2012, 21:09 [ТС] | 7 | |||||
Спасибо.И всё же.))
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
09.09.2012, 21:14 | 8 |
RASHFor, да, это конструктор. С двумя параметрами. Один из них (второй) имеет значение по умолчанию. Это значит, что конструктор может быть вызван как с одним, так и с двумя аргументами. В первом случае вызов Foo bar(10) эквивалентен вызову Foo bar(10, 0) (если второй аргумент явно не указан, будет передано его значение по умолчанию). После двоеточия через запятую идёт список инициализации конструктора, по факт - вызов конструкторов других объектов.
2
|
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
|
|
09.09.2012, 21:18 [ТС] | 9 |
Спасибо,вроде въехал.трошки.
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
09.09.2012, 21:34 | 10 |
1
|
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
|
||||||
31.01.2015, 21:06 | 11 | |||||
Как, используя список инициализации, организовать проверку передаваемых в конструкторе значений?
Скажем, если значение больше нуля, то этим значением инициализируем поле класса, иначе нет.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
31.01.2015, 21:31 | 12 | |||||
неужели?
http://rextester.com/RLMP92136
0
|
Комп_Оратор)
|
||||||
31.01.2015, 21:53 | 13 | |||||
hoggy, больше года как это обсуждалось.
Константа встроенного типа с инициализирующим значением не передаваемым в конструктор становится угрожающе статической. Ведь инициализируя её литералом или другой константой Вы делаете её одинаковой для всех экземпляров. Хотя каждый будет иметь свою копию в отличие от настоящей статической константы. Я затрудняюсь определить пол такой переменной. Но может где-то и нужно такое. Расскажите где. Я не имею большого опыта и хотел сказать о, примерно, таком случае:
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
31.01.2015, 22:03 | 14 | |||||
"угрожающе статической" - это что, определение гуманитариев?
Она была и остается обычным мембером класса. Причем, совершенно не принципиально встроенный это тип, или нет: http://rextester.com/TNHWV64207
мемберы можно инициализировать не только в списках инициализации. Вот и все. Ваше "не получится" - это присвоение, а не инициализация. Очевидно, что раз мембер - константа, то присвоить ему новое значение уже нельзя. Только к инициализации это вообще не имеет никакого отношения
0
|
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
|
|
31.01.2015, 22:05 | 15 |
hoggy, ответте на мой вопрос, пожалуйста. Похоже, в данной ветке вы самый "прошаренный"
0
|
Комп_Оратор)
|
|
31.01.2015, 22:10 | 16 |
Холливар? Не интересует.
А кто спорит. Но увсех мемберов этого пола: const int a = 10; для всех экземпляров будет одно значение: 10 А присвоение при объявлении и в теле конструктора это инициализация. Хотя синтаксически - присвоение. Не по теме: В чём источник энергии спора? Любовь к истине?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
31.01.2015, 23:12 | 17 | ||||||||||
Область применения списка инициализации:
когда возникла необходимость определить конструктор. Если пользовательский конструктор вам не нужен, очевидно что и списки тоже не нужны. Вопрос звучит примерно так: "правильно ли утверждение, что колесо автомобиля можно заменить автомобилем?" Добавлено через 10 минут Правила языка с++ Ну и что? Смысли к чему это было сказано? Во-первых, в теле конструктора нет никаких объявлений мемберов. Мемберы объявляются в декларации класса. А во-вторых: http://rextester.com/OHL21223
Либо глупость. А это уже не лечится. В общем случае это может быть нужно тогда, когда требуется гарантировать неизменность данных. Но при этом в силу того, что источник данных может быть различным для различных экземпляров, то необходимо обеспечить уникальность данных для каждого экземпляра. Например, мне попадалась задача, где были ноды, которые по задаче не могли существовать без родителя, и не могли его поменять на протяжении своей жизни. А самого родителя могли использовать только для чтения. Но не для изменения. И поэтому, я использовал const reference. ------------------------------------------------------------------- Ещё бывают случаи, когда есть внешние статические неизменяемые данные. А конкретные объекты-потребители в целях оптимизации держат на них лишь ссылки/указатели. В этом случае так же необходимо гарантировать, что экземпляры-владельцы ничайно не начнут их менять. ------------------------------------ В целом же, просто здравый смысл: если у класс есть объект который по смыслу должен быть неизменным - он делается константным. Это как минимум улучшает читабельность. В коде это могло бы выглядеть примерно так: http://rextester.com/HUAX7966
разные экземпляры класса simulator используют разные источники данных для name. Но изменять содержимое объекта на который указывает name нельзя ни при каких обстоятельствах. Потому что изменение объектов являющихся константами от рождения - есть UB. Автор кода помечает name квалификатором const, что бы гарантировать это положение.
0
|
Комп_Оратор)
|
|
01.02.2015, 00:49 | 18 |
Вы говорите о необходимости статических констант? А я спросил о том, зачем может понадобиться куча одинаковых по значению копий (мемберов как вы говорите).
Фраза: в ней ясно, что речь не о статической константе, а о константе члене. И о бессмысленности её инициализации литералом, а не внешним параметром. Но Вы хотите не увидеть и пишете: Хотя нигде не говорилось иного. Ещё фраза: Тут перечислены 2 случая, но не через запятую а с союзом "и": a) int a = 123;//глобально, локально, как угодно б) объявление в классе, а инициализация присвоением в конструкторе. Это вопрос скользкий и в общем случае наверное инициализации тут нет, а есть присваивание. Не буду спорить, - неточно сказал. Но вопрос ТС: оставляет только догадываться о чём он пытался спросить. Возможно о том, что когда в членах определены конструкторы преобразования и не определены конструкторы по умолчанию, то инициализация в списке, это способ гарантирующий инициализацию до вызова любого из методов. Однако, судя по тому как вопрос задан, это наверное и хорошо, что никто не стал об этом говорить. Надеюсь продолжения не будет.
0
|
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 6
|
|
01.02.2015, 01:39 | 19 |
Простое правило, которое использую лично я, если это конструктор в котором просто инициализируются данные, то - это список инициализации, если есть выделение памяти или же какие-то еще нюансы, тогда описываю все в конструкторе, а по-поводу консруктора по-умолчанию, его всегда надо писать по-умолчанию и через тот же список инициализации задавать значения по-умолчанию.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
01.02.2015, 01:41 | 20 | |||||||||||||||
Нет.
Если вы внимательно перечитаете, то увидете, что речь идет о не статических членах класса. И если вы внимательно посмотрите на пример-иллюстрацию в коде (можете запустить его на онлайн компиляторе, по ссылке, что я оставил), то увидите пример использования именно не статических неизменяемых членов класса. Ложь. Изначальный тезис был: Я привел пример использования не статического, и неизменяемого члена класса, который инициализируется другой константой. Инициализация неизменяемого нестатического члена класса только литералами действительно избыточна, и не эффективна, поскольку не имеет никаких полезных свойств, которые нельзя было бы заполучить более эффективным способом: при помощи локальных статических объектов. Однако, класс не контролирует источник данных для своих конструкторов. И не может накладывать на это никаких ограничений. Другими словами, проектируя класс вы не можете закладываться на то, как именно будут конструировать объект, если его конструкторы - публичны. Может быть так:
А в отсутствии ограничений само по себе рассуждение на тему: "бессмысленности инициализации литералом, а не внешним параметром" - не имеет смысла. Вы все равно не знаете, как именно будет делать пользователь. А он может сделать как захочет. Вы писали: Иногда лучше вообще ничего не писать, чем писать "хрень". По-моему вы мне мозги полоскаете. Нет? Это именно инициализация, а не присвоение. Он не знает материал, поэтому не может сформулировать точно вопрос. По идее, находится кто нибудь, кто чисто по человечески догадывается (хотя бы примерно) о чем речь. Ну или переспрашивает, наталкивая новичка на более корректные вопросы... И по итогу, в ходе диалога выясняются "заблуждения" новичка, а сам новичок ликвидирует собственное недопонимание. В этом заключается суть "с++ раздел для новичков", разве нет?
1
|
01.02.2015, 01:41 | |
01.02.2015, 01:41 | |
Помогаю со студенческими работами здесь
20
Когда нужно использовать структуры, когда классы, а когда словарь? 1c8 когда лучше использовать запрос, а когда выбор Когда следует использовать значимый тип, а когда ссылочный? Когда нужно использовать ссылку с out, а когда с ref Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |