Russian Qt Forum
Март 29, 2024, 12:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Default constructor  (Прочитано 10416 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 05, 2020, 12:09 »

Добрый день

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

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

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #1 : Июль 05, 2020, 13:04 »

Чтобы default сработал, надо присвоить значения в объявлении
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 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 и др
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #3 : Июль 05, 2020, 14:48 »

CDrawInst() = default это делает? Или это уже и так делается с новыми стандартами?
Нет.

Вопрос был можно ли как-то занулять "автоматом", как делают template для указателей, int и др

Совсем автоматом нельзя, надо скобочки руками писать (Member initialization.):
Код
C++ (Qt)
struct CDrawInst {
// data
 CMaterial * m_material{};
 int m_count{};
...
};
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 06, 2020, 06:48 »

Совсем автоматом нельзя, надо скобочки руками писать (Member initialization.):
Понял, спасибо. Заметим что по приведенной ссылке конкретно приведенного Вами примера нет (как-то не очень хорошо документируют)
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 861


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #5 : Июль 06, 2020, 09:17 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #6 : Июль 06, 2020, 11:44 »

Заметим что по приведенной ссылке конкретно приведенного Вами примера нет (как-то не очень хорошо документируют)

По приведённой ссылке примеры, что поля класса в принципе можно инициализировать (начиная с С++11). А способов инициализации в С++ до фига, и в них чёрт ногу сломит Улыбающийся. Например, агрегат  можно целиком "занулить" так (без явной инициализации полей класса):

Код
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{};) может и не происходить.
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Июль 06, 2020, 12:16 »

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

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

Так что int m_count{} должно в 0 инициализироваться.
Записан

Пока сам не сделаешь...
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #8 : Июль 06, 2020, 12:44 »

Добрый день

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

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

Спасибо

Могу ещё посоветовать обнулить в конструкторе в стиле С: memset.
В большинстве случаев оно того не стОит, но это же работа с графикой, а мемсет очень хорошо оптимизирован под SSE.
« Последнее редактирование: Июль 06, 2020, 12:49 от Azazello » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Сентябрь 03, 2020, 10:14 »

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


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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #10 : Сентябрь 03, 2020, 11:55 »

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

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

+1. Я тоже так делаю. Скобки малочитаемы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.339 секунд. Запросов: 23.