Название: Default constructor Отправлено: Igors от Июль 05, 2020, 12:09 Добрый день
Справочник открывал, но на сей раз там так много и мутно... лучше спрошу у знающих людей Есть масса простых структур, напр Код Единственное что мне нужно в конструкторе - прописать все такие POD члены нулями, и все. CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами? Или по старинке расписывать? Это конечно нетрудно, но надо же как-то у культуре приобщаться :) Спасибо Название: Re: Default constructor Отправлено: kambala от Июль 05, 2020, 13:04 Чтобы default сработал, надо присвоить значения в объявлении
Название: Re: Default constructor Отправлено: Igors от Июль 05, 2020, 13:53 Чтобы default сработал, надо присвоить значения в объявлении Я это всю жизнь и деаюКод Вопрос был можно ли как-то занулять "автоматом", как делают template для указателей, int и др Название: Re: Default constructor Отправлено: ViTech от Июль 05, 2020, 14:48 CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами? Нет.Вопрос был можно ли как-то занулять "автоматом", как делают template для указателей, int и др Совсем автоматом нельзя, надо скобочки руками писать (Member initialization (https://en.cppreference.com/w/cpp/language/data_members#Member_initialization).): Код
Название: Re: Default constructor Отправлено: Igors от Июль 06, 2020, 06:48 Совсем автоматом нельзя, надо скобочки руками писать (Member initialization (https://en.cppreference.com/w/cpp/language/data_members#Member_initialization).): Понял, спасибо. Заметим что по приведенной ссылке конкретно приведенного Вами примера нет (как-то не очень хорошо документируют)Название: Re: Default constructor Отправлено: sergek от Июль 06, 2020, 09:17 На мой взгляд, лучше делать это явно:
Код
Название: Re: Default constructor Отправлено: ViTech от Июль 06, 2020, 11:44 Заметим что по приведенной ссылке конкретно приведенного Вами примера нет (как-то не очень хорошо документируют) По приведённой ссылке примеры, что поля класса в принципе можно инициализировать (начиная с С++11). А способов инициализации (https://en.cppreference.com/w/cpp/language/initialization) в С++ до фига, и в них чёрт ногу сломит :). Например, агрегат (https://en.cppreference.com/w/cpp/language/aggregate_initialization) можно целиком "занулить" так (без явной инициализации полей класса): Код
Но если CDrawInst перестанет быть агрегатом: Код то "зануление" inst в такой форме записи (CDrawInst inst{};) может и не происходить. Название: Re: Default constructor Отправлено: ViTech от Июль 06, 2020, 12:16 На мой взгляд, лучше делать это явно: Код
Можно, конечно, перестраховаться, но Value initialization (https://en.cppreference.com/w/cpp/language/value_initialization): Цитировать This is the initialization performed when a variable is constructed with an empty initializer. ... The effects of value initialization are: 1) if T is a class type with no default constructor or with a user-provided or deleted default constructor, the object is default-initialized; 2) if T is a class type with a default constructor that is neither user-provided nor deleted (that is, it may be a class with an implicitly-defined or defaulted default constructor), the object is zero-initialized and then it is default-initialized if it has a non-trivial default constructor; 3) if T is an array type, each element of the array is value-initialized; 4) otherwise, the object is zero-initialized (https://en.cppreference.com/w/cpp/language/zero_initialization). Так что int m_count{} должно в 0 инициализироваться. Название: Re: Default constructor Отправлено: Azazello от Июль 06, 2020, 12:44 Добрый день Справочник открывал, но на сей раз там так много и мутно... лучше спрошу у знающих людей Есть масса простых структур, напр Код Единственное что мне нужно в конструкторе - прописать все такие POD члены нулями, и все. CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами? Или по старинке расписывать? Это конечно нетрудно, но надо же как-то у культуре приобщаться :) Спасибо Могу ещё посоветовать обнулить в конструкторе в стиле С: memset. В большинстве случаев оно того не стОит, но это же работа с графикой, а мемсет очень хорошо оптимизирован под SSE. Название: Re: Default constructor Отправлено: Racheengel от Сентябрь 03, 2020, 10:14 На мой взгляд, лучше делать это явно: Код
+1. Я тоже так делаю. Скобки малочитаемы. Название: Re: Default constructor Отправлено: Авварон от Сентябрь 03, 2020, 11:55 На мой взгляд, лучше делать это явно: Вот только такая инициализация не всегда работает - например QMutex m_mutex = QMutex::Recursive вроде не компилируется, а с {} компилируется.Код
+1. Я тоже так делаю. Скобки малочитаемы. |