专业编程基础技术教程

网站首页 > 基础教程 正文

C++11 统一的初始化 c++11初始化列表

ccvgpt 2024-10-10 05:02:39 基础教程 58 ℃

C++11引入了统一的初始化(Uniform Initialization),它是一种新的初始化语法,能够用相同的语法方式来初始化不同的对象。在C++11之前,C++有多种初始化语法,包括传统的C风格初始化、构造函数初始化和聚合体初始化等,这使得代码不够简洁,也不够直观。统一的初始化语法通过一种统一的方式来初始化所有类型的对象,这在简化代码方面有着重要的作用。

在使用统一初始化时,可以使用花括号{}来进行初始化,无论是原生数组、STL容器、结构体还是类,都可以使用统一初始化语法。下面是一个示例:

C++11 统一的初始化 c++11初始化列表

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int arr[3] = {1, 2, 3}; // 原生数组初始化
    vector<int> vec{1, 2, 3}; // STL容器初始化
    struct Person {
        string name;
        int age;
    };
    Person p{"Tom", 18}; // 结构体初始化
    cout << arr[0] << " " << vec[1] << " " << p.name << " " << p.age << endl;
    return 0;
}

在上面的示例中,使用了统一的初始化方式对数组、STL容器和结构体进行初始化,并输出了对应的值。从代码中可以看出,使用统一的初始化方式可以使代码更加简洁易懂。

除了使用花括号进行初始化外,还可以使用等号=进行初始化。使用等号进行初始化时,编译器会自动判断要调用的构造函数,如果是默认构造函数,则使用默认构造函数进行初始化,否则使用对应的构造函数进行初始化。下面是一个示例:

#include <iostream>
#include <string>

using namespace std;

class Person {
public:
    string name;
    int age;
    Person() : name(""), age(0) {} // 默认构造函数
    Person(string name_, int age_) : name(name_), age(age_) {} // 带参数的构造函数
};

int main() {
    Person p1{}; // 调用默认构造函数初始化
    Person p2{"Tom", 18}; // 调用带参数的构造函数进行初始化
    cout << p1.name << " " << p1.age << endl;
    cout << p2.name << " " << p2.age << endl;
    return 0;
}

在上面的示例中,使用等号进行初始化时,编译器会根据对象的类型自动调用对应的构造函数,如果没有提供默认构造函数,则不能使用等号进行初始化。

统一初始化语法除了可以使代码更加简洁易懂外,还有一些其他的优点,包括:

  1. 避免了隐式类型转换。在使用花括号进行初始化时,编译器会根据初始化列表的类型进行类型推导,从而避免了隐式类型转换,提高了代码的可读性和健壮性。
  2. 支持更多类型的初始化。相比于传统的构造函数初始化,统一初始化语法可以支持更多类型的初始化,包括数组、结构体、类等。
  3. 简化了构造函数的实现。通过使用统一初始化语法,可以避免在类的构造函数中重复定义变量,简化了构造函数的实现。
  4. 可以进行聚合体初始化。聚合体是指没有用户定义的构造函数、没有私有或保护的非静态数据成员、没有基类、没有虚函数的类类型或数组类型。使用统一初始化语法可以方便地对聚合体进行初始化。

最近发表
标签列表