Инициализаторы в С++

yolki

Это новая мода такая?
int r(0);
?

Werdna

Не знал такой клёвой конструкции, неужели так можно? :)
Это же прекрасно!

Dasar

афаик, этой фишкой прикалывались от сотворения первого стандарта С++

yolki

конечно можно.
SomeClass C(x,y); - вызывается конструктор.
А в С++ всегда у int-ов были конструкторы?

apl13

А в С++ всегда у int-ов были конструкторы?
А в C++ everything is a class.
И, типа, писать конструкцию вместо присваивания православнее.

Serab

А в C++ everything is a class.
:net:

Serab

А в С++ всегда у int-ов были конструкторы?
после появления шаблонов точно должны были быть.

enochka1145

// int r(0);
(Когда я вижу такое в коде, рука сама тянется к маузеру.)
Это полезно только для шаблонов.

apl13

А ч0, а ч0, а ч0 ваще? :o

enochka1145

// Это же прекрасно!
Тогда давай так:
int r(int;
И все сразу поймут, кто тут отец.

Serab

ну вот в .NET everything is a class, там можно 42.ToString а тут же есть POD, это деление довольно четкое :)

okunek

Прекращай писать всякую чушь, а то все сразу поймут кто тут дебил.

Maurog

SomeClass C(x,y); - вызывается конструктор.
А в С++ всегда у int-ов были конструкторы?
а при чем тут конструкторы? это синтаксис для инициализации скалярных типов
читать стандарт 8.5 Initializers, хотя там не тривиально :grin:
самый последний главный абзац
8.5.14
...
— Otherwise, the initial value of the object being initialized is the (possibly converted) value of the initializer
expression. Standard conversions (clause 4) will be used, if necessary, to convert the initializer
expression to the cv-unqualified version of the destination type; no user-defined conversions are considered.
If the conversion cannot be done, the initialization is ill-formed.

bleyman

Тогда давай так:
int r(int;
И все сразу поймут, кто тут отец.

FYI:
1) int r; — POD типы не инициализируются автоматически.
3) int r; — объявление функции, возвращающей инт, привет.
2) int r = 0; — ну ок, но чем так уж лучше int r(0)?
Надеюсь, все сразу поняли, кто тут отец, а кто совершенно нет!
ps: also, в initializer list у какой-нибудь структуры всё равно придётся писать именно r(0 и это намного православней, чем руками инициализировать в конструкторе.

enochka1145

// FYI:
Народ, что вы мне всё пытаетесь объяснить? Я в C++ не знаю всего одну вещь. Всего одну: что происходит, когда деструктор выбрасывает исключение. Всё время перечитываю и всё время снова забываю. В остальном - полный порядок.
Уже третий никчёмный ответ. Откройте блин уже Студию и проверьте, что код делает, для начала.

enochka1145

// ps: also, в initializer list у какой-нибудь структуры всё равно придётся писать именно r(0 и это намного православней, чем руками инициализировать в конструкторе.
А вот это дельное замечание, спасибо. Хотя эффект в конечном коде один и тот же (в релизе рука тянется к маузеру уже насчёт тех, кто не пишет m_r(0 это да.

Serab

рука должна тянуться к маузеру уже на символах m_

Serab

Я в C++ не знаю всего одну вещь. Всего одну
сын страуструпа (тоже страуструп) в треде штоле?

Serab

бля, петросян точно в треде, запорол шутку, звиняйте :(

enochka1145

По делу есть чё, петросян?

bleyman

> Народ, что вы мне всё пытаетесь объяснить?
Ну, ты же сам написал "int r(int;", в порядке смехуёчков. Так доложи теперь, насчёт чего именно были смехуёчки. As it is, выглядит как будто ты продвигал идею что нужно писать "int r;", ну, это, не работает, как бы.
> Откройте блин уже Студию и проверьте, что код делает, для начала.
Какой код О_о

evgen5555

В остальном - полный порядок.
Так поведай же, где именно там полный порядок!

enochka1145

Следите за руками:
int - это 0 (нуль).
int r(int; - это int r(0);, т.е. int r = 0;
(Я - за int r = 0;)
Если это не очевидно, попробуй поставить брейкпойнт на этой строчке в Студии и посмотреть, что будет.

Serab

А ты не понимаешь?
Не знает только что происходит при броске исключения из деструктора, ХА.

enochka1145

Тяжело, наверно, без чувства юмора жить? Или ты из тех, кто признаёт только хохмы собственного изготовления?

alfadred

g++
in function main:a.cpp(.text+0x5): error: undefined reference to 'r(int (*'

bleyman

int - это 0 (нуль).
int r(int; - это int r(0);, т.е. int r = 0;

Я не понимаю. Ты до самого конца осознал, что выражение "int r;" не парсится как инициализатор инта дефолтным конструктором? Если да, то какую разницу ты видишь между "int r(0);" и "int r = 0;"?
Ну то есть я твои комментарии читаю как хихиканье на тему лишних вещей, как если бы кто написал "if (x == true)", а ты ему в ответ, "if x == true) == true)".
Чо ты сказать-то пытался, аааа?

enochka1145

Так.
Я затупил. Признаю.
[гнилые оправдания mode on]
Я ж никогда такой херни в настоящем коде не пишу!

Serab

ок, ну если шутка, то ок, но она ведь неуместна, ты же при этом пишешь херню :grin:

enochka1145

А чем тебе не угодили префиксы "m_"?

Serab

Это тоже была шутка, просто я не люблю именно это подражательство MFC, а так надо отличать данные-члены да, как — на усмотрение, конечно, я пишу с маленькой буквы...

doublemother

А чем тебе не угодили префиксы "m_"?
Потому что это дурацкий подход — вносить в имя переменной информацию о типе, приватности и т.п. Это избыточные данные, которые при необходимости должна отображать IDE.

Maurog

Потому что это дурацкий подход — вносить в имя переменной информацию о типе, приватности и т.п. Это избыточные данные, которые при необходимости должна отображать IDE.
единой точки зрения нет
обычно это регулируется кодинг стандартом, а не имхами каждой обезьянки :grin:
в коде приходится совмещать двойную информацию - информация для компилятора (чтобы код скомпилировался и работал как надо) и информация для человека (в роли читателя, чтобы он понимал что происходит в коде). тут приходится чем-то жертвовать, например, вносить избыточность

doublemother

единой точки зрения нет
обычно это регулируется кодинг стандартом, а не имхами каждой обезьянки
Ну сам подумай, для чего это делают, и почему вносят в кодинг стандарты?
Потому что считают, что не всегда ясно, с чем ты работаешь — локальной переменной, переменной класса или ещё чем. Потому что lead devel помнит ещё динозавров и кричит, что он должен иметь возможность нормально править код даже в ненастроенном nvi по ssh, а там никакие видимости-типы, разумеется, не подсвечиваются. И это не шутка, они так действительно заявляют.

ava3443

должен иметь возможность нормально править код даже в ненастроенном nvi по ssh, а там никакие видимости-типы, разумеется, не подсвечиваются. И это не шутка, они так действительно заявляют.
интересно, пользовался ли ты хоть раз отладчиками gdb/dbx по ssh?

doublemother

gdb постоянно, а что?

yolki

есть какие-то проблемы настроить редактор vi?

doublemother

Есть люди, которые не хотят его настраивать.
И, да, vi/nvi и vim — это две очень большие разницы.

yolki

разве не достаточно один раз его настроить под себя?
и да, говоря vi я естественно имел в виду vim

doublemother

Я для себя настроил. А объяснять что-либо пресловутым олдфагам зачастую нереально. Обязательно последует что-нибудь в стиле «а вдруг мне придётся срочно спьяну править код в бизибоксе, где есть только vi, никаких настроек и вообще кошмар».

Maurog

Обязательно последует что-нибудь в стиле «а вдруг мне придётся срочно спьяну править код в бизибоксе, где есть только vi, никаких настроек и вообще кошмар».
будете удивлены, но сейчас именно этим и занимаюсь
на обрезанном линуксе приходится дебужить прогу через gdb + ssh
загрузился с .iso, так что настроить в этом образе vi мне сложновато (да и не фанат я этого редактора ибо виндузятник)
зы: из этого енвайромента акронис ресторит операционку, данные в рамдиске, архив на шаре или примаунченном диске из живой операционки

pitrik2

ну дык потому и кодинг стандарты
где прога будет запускаться в бизибоксах - там целесообразно префиксы пихать
а где нет - то нет
у нас в команде кодинг стандарта на работе нету
есть только типа негласное правило: если правишь чужую функцию то стараешься там в том же стиле писать
код конечно зоопарк, но со временем привыкаешь и пофиг где какой стиль
базарили тут с одним про префиксы
в итоге сошлись на том что ему нужен только один тип префикса: у приватных членах классов подчеркивание в начале
сказал что весь свой код переделает :)

Maurog

ну дык потому и кодинг стандарты
где прога будет запускаться в бизибоксах - там целесообразно префиксы пихать
а где нет - то нет
неверно рассуждаете
у нас кодинг стандарт не опирается на бизибоксы, код пишется по одинаковым правилам под все платформы (win, dos, linux, mac etc). (зы: у нас префиксы вообще запрещены, обруливаются с помощью pascal, camel casing)

Serab

у нас префиксы вообще запрещены, обруливаются с помощью pascal, camel casing
ну воот, а локальные внутри функции и private-члены как-нибудь различаются при этом?

Maurog

ну воот, а локальные внутри функции и private-члены как-нибудь различаются при этом?
нет
ошибся :(
члены класса в Pascal casing, локальные переменные и аргументы функций в camel casing

istran

Ты отстал от жизни. По новому стандарту модно делать так:
int r{0};  
Оставить комментарий
Имя или ник:
Комментарий: