Initialization of classes using uniform initialization in C++

In C++, initializing classes can sometimes be cumbersome and confusing, especially when dealing with different types of constructors. However, with C++11 and later versions, a new feature called uniform initialization was introduced to simplify the initialization syntax and make it more consistent.

The uniform initialization syntax allows us to initialize objects of a class using a single set of braces {}. This means that regardless of whether we are initializing built-in types, arrays, or classes, we can use the same syntax, making the code more readable and less error-prone.

Let’s consider a simple example to understand how uniform initialization works:

class Person {
    std::string name;
    int age;

public:
    Person(const std::string& n, int a) : name(n), age(a) {}
    
    // ...
};

int main() {
    // Using uniform initialization to create a Person object
    Person person{"John Doe", 25};

    // ...
    
    return 0;
}

In the above code, we have a Person class with a constructor that takes a std::string and an int. Rather than using the traditional constructor syntax, we can initialize the person object using uniform initialization with the braces {}.

This uniform initialization syntax makes it clear that we are initializing the object, and also eliminates the possibility of the most vexing parse where accidental function declarations may occur.

Uniform initialization also allows us to provide default values for member variables without explicitly defining a default constructor. Here’s an example:

class Rectangle {
    int width = 0;
    int height = 0;

public:
    // ...
};

int main() {
    // Using uniform initialization to create a Rectangle object with default values
    Rectangle rect{};

    // ...
    
    return 0;
}

In the above code, the Rectangle class has member variables width and height initialized to 0. With uniform initialization, we can create a Rectangle object rect with default values using {}.

Uniform initialization can be used in various scenarios, including initializing arrays, initializing aggregates, and initializing member variables of a class in the member initialization list.

In conclusion, uniform initialization in C++ provides a consistent and concise way of initializing objects of a class. It simplifies the initialization syntax and enhances code readability. It is recommended to utilize uniform initialization whenever possible to improve code quality and reduce potential errors.

References: