С C++20 мы получаем удобный способ инициализации элементов данных. Новая функция называется Designated Initializers и может быть знакома программистам на C. Другими словами, назначенные инициализаторы — это новая функция, представленная в C++20. Это позволяет разработчикам или программистам инициировать элементы данных структуры или массива в любом порядке, который они хотят, обеспечивая более читаемый и гибкий способ инициализации членов данных.
В C++20 тип Collection определяется как тип массива или тип класса, отвечающий определенным критериям. Тип Collection не должен иметь закрытых или защищенных прямых нестатических элементов данных, объявленных пользователем или унаследованных конструкторов, виртуальных, частных или защищенных базовых классов или виртуальных функций-членов. Это определение помогает идентифицировать и отличать типы Collection от других типов в C++.
Синтаксис:
struct_type obj_name = { .member1 = value1, .member2 = value2, member3 = value3, ...... .memberN = valueN };
Где,
- struct_type:имя типа структуры.
- obj_name:имя инициализируемого объекта.
- member1 to memberN:Имена инициализируемых элементов данных.
- от value1 до valueN:значения, присваиваемые соответствующим членам данных.
- Мы используем оператор точки (. ), за которым следует имя члена, чтобы указать член, который мы хотим инициализировать.
Зачем использовать назначенные инициализаторы?
- Назначенные инициализаторы повышают удобочитаемость.
- Это удобный способ инициализации элементов данных.
- Назначенные инициализаторы помогают идентифицировать и отличать типы Collection от других типов в C++.
Пример:
С++
// C++ Program to initialize Structure Date with dt
// Designated Initializer
#include <iostream>
using
namespace
std;
// Create Structure
struct
Date {
int
year;
int
month;
int
day;
};
int
main()
{
Date dt{ .year = 2023, .month = 4, .day = 24 };
cout <<
"Year : "
<< dt.year <<
"\n"
;
cout <<
"Month : "
<< dt.month <<
"\n"
;
cout <<
"Day : "
<< dt.day;
return
0;
}
Выход
Year : 2023 Month : 4 Day : 24
Преимущества назначенных инициализаторов
Назначенные инициализаторы в C++20 предлагают несколько преимуществ:
Удобочитаемость и ремонтопригодность.Используя назначенные инициализаторы, легко понять, какой элемент инициализируется с каким значением, даже если структура имеет много элементов.
Частичная инициализация или инициализация подмножества:это позволяет нам инициализировать только подмножество элементов в структуре. Это может быть полезно, когда мы не хотим инициализировать все элементы strict или когда нам нужно инициализировать только несколько членов.
Гибкая инициализация:это позволяет нам инициализировать элементы структуры или массива в любом порядке. Это может быть полезно, когда мы хотим инициализировать элементы в определенном порядке или когда мы хотим сгруппировать связанные элементы вместе.
Вложенные структуры и массивы.Назначенные инициализаторы также можно использовать для инициализации вложенных структур или массивов, что делает инициализацию сложных структур данных более простой и удобной для чтения. Это также может уменьшить объем стандартного кода, необходимого для инициализации, поскольку мы можем напрямую указывать значения для каждого члена вместо создания временных переменных или использования нескольких операторов присваивания.
Пример 1:
С++
// C++ Program to initialize a struct from a list of values
#include <iostream>
using
namespace
std;
struct
Date {
int
month;
int
year;
};
int
main()
{
// dt.month = 4, dt.year = 2023
Date dt{ 4, 2023 };
cout <<
"Month : "
<< dt.month <<
"\n"
;
cout <<
"Year : "
<< dt.year <<
"\n"
;
return
0;
}
Выход
Month : 4 Year : 2023
Теперь представьте, если бы мы обновили определение структуры, добавив новый член, который не является последним членом.
Пример 2:
С++
#include <iostream>
using
namespace
std;
struct
Date {
int
day;
int
month;
int
year;
};
int
main()
{
// dt.day = 4, dt.month = 2023, dt.year = 0
Date dt{ 4, 2023 };
cout <<
"Month : "
<< dt.month <<
"\n"
;
cout <<
"Year : "
<< dt.year <<
"\n"
;
cout <<
"Day : "
<< dt.day;
return
0;
}
Выход
Month : 2023 Year : 0 Day : 4
Однако с помощью назначенных инициализаторов мы можем просто добавить новый элемент и обновить его значение, не затрагивая код инициализации. Это может сэкономить время и усилия, а также снизить вероятность появления ошибок из-за человеческого фактора.
Инициализация с назначенными инициализаторами
Пример:
С++
#include <iostream>
using
namespace
std;
struct
Date {
int
day;
int
month;
int
year;
};
int
main()
{
Date dt{ .day = 24, .month = 4, .year = 2023 };
// dt.day = 24, dt.month = 4, dt.year = 2023
cout <<
"Month : "
<< dt.month <<
"\n"
;
cout <<
"Year : "
<< dt.year <<
"\n"
;
cout <<
"Day : "
<< dt.day;
return
0;
}
Выход
Month : 4 Year : 2023 Day : 24
Пример:
С++
// C++ program to initialize a subset of members of a struct
// using designated initializers
#include <iostream>
using
namespace
std;
struct
Rectangle {
int
length;
int
width;
int
height;
};
int
main()
{
Rectangle rect = { .length = 10, .width = 5 };
cout <<
" Length : "
<< rect.length <<
"\n"
;
cout <<
" Width : "
<< rect.width <<
"\n"
;
cout <<
" Height : "
<< rect.height;
return
0;
}
Выход
Length : 10 Width : 5 Height : 0