Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Июль 05, 2020, 12:09



Название: Default constructor
Отправлено: Igors от Июль 05, 2020, 12:09
Добрый день

Справочник открывал, но на сей раз там так много и мутно... лучше спрошу у знающих людей

Есть масса простых структур, напр
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material;
 int m_count;
...
};
 
Единственное что мне нужно в конструкторе - прописать все такие POD члены нулями, и все. CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами? Или по старинке расписывать? Это конечно нетрудно, но надо же как-то у культуре приобщаться :)

Спасибо


Название: Re: Default constructor
Отправлено: kambala от Июль 05, 2020, 13:04
Чтобы default сработал, надо присвоить значения в объявлении


Название: Re: Default constructor
Отправлено: Igors от Июль 05, 2020, 13:53
Чтобы default сработал, надо присвоить значения в объявлении
Я это всю жизнь и деаю
Код
C++ (Qt)
struct CDrawInst {
 CDrawInst( void ) : m_material(0), m_count(0)
 {
 }
 
// data
 CMaterial * m_material;
 int m_count;
...
};
Вопрос был можно ли как-то занулять "автоматом", как делают 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).):
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material{};
 int m_count{};
...
};


Название: 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
На мой взгляд, лучше делать это явно:
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material = nullptr;
 int m_count = 0;
...
};
 


Название: 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)  можно целиком "занулить" так (без явной инициализации полей класса):

Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material;
 int m_count;
...
};
 
void test()
{
 CDrawInst inst{};
 assert(inst.m_material == nullptr);
 assert(inst.m_count == 0);
}

Но если CDrawInst перестанет быть агрегатом:
Код
C++ (Qt)
struct CDrawInst {
 CDrawInst() {};
// data
 CMaterial * m_material;
 int m_count;
...
};
то "зануление" inst в такой форме записи (CDrawInst inst{};) может и не происходить.


Название: Re: Default constructor
Отправлено: ViTech от Июль 06, 2020, 12:16
На мой взгляд, лучше делать это явно:
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material = nullptr;
 int m_count = 0;
...
};
 

Можно, конечно, перестраховаться, но 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
Добрый день

Справочник открывал, но на сей раз там так много и мутно... лучше спрошу у знающих людей

Есть масса простых структур, напр
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material;
 int m_count;
...
};
 
Единственное что мне нужно в конструкторе - прописать все такие POD члены нулями, и все. CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами? Или по старинке расписывать? Это конечно нетрудно, но надо же как-то у культуре приобщаться :)

Спасибо

Могу ещё посоветовать обнулить в конструкторе в стиле С: memset.
В большинстве случаев оно того не стОит, но это же работа с графикой, а мемсет очень хорошо оптимизирован под SSE.


Название: Re: Default constructor
Отправлено: Racheengel от Сентябрь 03, 2020, 10:14
На мой взгляд, лучше делать это явно:
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material = nullptr;
 int m_count = 0;
...
};
 


+1. Я тоже так делаю. Скобки малочитаемы.


Название: Re: Default constructor
Отправлено: Авварон от Сентябрь 03, 2020, 11:55
На мой взгляд, лучше делать это явно:
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material = nullptr;
 int m_count = 0;
...
};
 

Вот только такая инициализация не всегда работает - например QMutex m_mutex = QMutex::Recursive вроде не компилируется, а с {} компилируется.

+1. Я тоже так делаю. Скобки малочитаемы.