Назначенные инициализаторы в C++ 20

Возврат массива из функции C++ Программирование и разработка

С 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 предлагают несколько преимуществ:

Читайте также:  Цикл событий Node.js: Руководство разработчика по концепциям и коду

Удобочитаемость и ремонтопригодность.Используя назначенные инициализаторы, легко понять, какой элемент инициализируется с каким значением, даже если структура имеет много элементов.
Частичная инициализация или инициализация подмножества:это позволяет нам инициализировать только подмножество элементов в структуре. Это может быть полезно, когда мы не хотим инициализировать все элементы 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

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

Читайте также:  Иерархическое наследование C++

Инициализация с назначенными инициализаторами

Пример:

С++

#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

Оцените статью
bestprogrammer.ru
Добавить комментарий