Двоеточие в определении конструктора
У меня возникла проблема с пониманием синтаксиса. Увидел вот такой конструктор:
Что значит двоеточие после аргумента в первых скобках?
Область кода за двоеточием и до начала тела конструктора называется списком инициализации членов (англ. "member initializer list").
Используется как для инициализации членов класса, так и для вызова конструктора базового/базовых классов, т.е. по сути, инициализации базовой составляющей. Также здесь может быть вызов другого конструктора текущего класса (делегирование конструкторов, начиная с c++11).
Без инициализатора конструктора не обойтись, если в классе присутствует член ссылочного типа или константа, или член класса, у которого нет конструктора по умолчанию:
т.к. код, начинающийся за фигурной скобкой будет приводить уже не к инициализации члена, а к присваиванию ему значения, чего нельзя сделать для упомянутых ранее ссылок или констант.
Дополнительно стоит заметить (как было упомянуто в комментарии Monah Tuk), что если член-класса не инициализирован явно в инициализаторе конструктора и при этом ему присваивается значение в теле конструктора, то он сначала будет инициализирован конструктором по умолчанию (или инициализацией в определении класса (c++11)):
После чего выполнится присваивание в теле конструктора. Для сложных классов это может приводить к дополнительным расходам.
Т.о. инициализацию членов стоит производить либо в определении класса, либо в инициализаторе конструктора. Не стоит пытаться сделать нечто подобное непосредственно внутри тела конструктора.
что делает двоеточие в c?
Мне дали этот пример в классе, и я не уверен, что он делает. Я понимаю, что двоеточие добавляет битовое поле, но я все еще не уверен в этом вопросе:
задан 16 марта ’12, 03:03
Ваш пример не битовая операция. Это тип оператора if-then-else, называемый тернарным оператором. — Java42
Интересно, кто голосует за эту штуку. c-faq, rtm. — Tomas Pruzina
Учитывая качество вопросов здесь в последнее время, это должен быть ежегодный вызов «Миграция с VB на C» — tbert
4 ответы
?: оператор называется условным оператором.
If b Значение > 0 , Значение 3 назначен на a иначе значение 1 назначен на a .
Возьмите свою книгу Кернигана и Ритчи, 2-е издание, глава 2.11 Условные выражения, объясняется поведение оператора.
ответ дан 16 мар ’12, в 05:03
Более известен как тернарный оператор. — Петр C
Он называется тернарным оператором, а не «условным». Видеть en.wikipedia.org/wiki/%3F: — пользователь405725
@VladLazarenko Стандарт C на самом деле называет его «условным оператором», хотя я согласен, что «тройной» встречается чаще. — Тимоти Джонс
@VladLazarenko Я удалил ваши изменения в своем ответе. я написал условный оператор нарочно. Это имя этого оператора в C. Тот факт, что он также является тернарным оператором (даже единственным тернарным оператором в C), является качеством оператора, но стандартное имя условный оператор (см. C99, 6.5.15 Условный оператор). — ауа
«: «(двоеточие) в структуре C — что это значит? [дубликат]
это битовые поля. В основном, число после двоеточия описывает, сколько битов использует это поле. Вот это цитата из MSDN описания битовых полей:
константное выражение, задающее ширину поля в битах. Этот спецификатор типа для Декларатора должен быть unsigned int, signed int или int, а константа-выражение должно быть неотрицательным целочисленным значением. Если значение равно нулю, объявление не имеет Декларатора. Массивы битов поля, указатели на битовые поля и функции, возвращающие битовые поля не позволять. Необязательный Декларатор называет битовое поле. Битовое поле может быть объявлен только как часть структуры. Адрес-оператора ( & ) не может быть применен к компонентам битового поля.
безымянные битовые поля нельзя ссылаться, и их содержание в время непредсказуемо. Их можно использовать как «фиктивные» поля, для цели выравнивания. Неименованное битовое поле, ширина которого определяется как 0 гарантирует, что хранение для члена, следующего за ним в struct-declaration-list начинается на границе int.
в этом примере определяется двумерный массив структур с именем screen.
Edit: еще один важный бит из ссылки MSDN:
битовые поля имеют ту же семантику, что и целочисленный тип. Это означает битовое поле используется в выражениях точно так же, как переменная того же базового типа будет используется, независимо от того, сколько бит в битовом поле.
быстрый пример хорошо иллюстрирует это. Интересно, что при смешанных типах компилятор по умолчанию принимает значение sizeof (int) .
«:» (Двоеточие) в структуре C — что это значит? [Дубликат]
Это битовые поля. В основном, число после двоеточия описывает количество бит, которое использует поле. Ниже приведена цитата из MSDN, описывающая битовые поля:
Константное выражение указывает ширину поля в битах. Тип-спецификатор для декларатора должен быть без знака int, подписанным int или int, а константное выражение должно быть неотрицательным целочисленным значением. Если значение равно нулю, декларация не имеет декларатора. Массивы бит поля, указатели на битовые поля и функции, возвращающие поля бит, являются не допускается. Необязательный declarator называет поле бит. Поля бит может быть объявлена только как часть структуры. Адрес-оператор (&) не может применяться к компонентам битового поля.
Неверные поля бита не могут быть указаны, а их содержимое при запуске время непредсказуемо. Они могут использоваться как поля «dummy», для выравнивание. Неименованное поле бит, ширина которого задается как 0 гарантирует, что хранение для члена, следующего за ним, в struct-declaration-list начинается с границы int.
В этом примере определяется двумерный массив структур с именем screen.
Изменить: еще один важный бит из ссылки MSDN:
Бит-поля имеют ту же семантику, что и целочисленный тип. Это означает, что бит используется в выражениях точно так же, как переменная того же базового типа, независимо от того, сколько бит в поле бит.
Быстрый образец хорошо иллюстрирует это. Интересно, что со смешанными типами компилятор по умолчанию имеет значение sizeof (int) .