C++11语法,统一初始化

本文探讨了统一初始化的便利性,不再需要显式调用构造函数来初始化对象,使用{}

统一初始化,不再需要像以前一样,显式的调用构造函数来初始化对象,直接{value1,value2,...}

看起来方便了很多。

下面来看一个例子。

#include <memory>
#include <stdio.h>
#include <stdlib.h>

class AA
{
public:    
    int a;
    int b;    
    AA()
    {
        printf("construct 123.\n");
    }
    AA(int ia,int ib)
    {
        ia = a;
        ib = b;
        printf("construct 123.\n");
    }
};

int main()
{
    std::unique_ptr<AA> object{new AA()};
    AA ab{1,2};
    return 0;
}

std::unique_ptr 类有个构造函数,传入一个AA兑现指针,因此可以写成 std::unique_ptr<AA> object{new AA()}; 这样。

AA ab{1,2};  这个都是和构造函数对应起来的。

### C++初始化语法详解 在 C++ 中,类的初始化是一个重要的概念,涉及到多种不同的技术手段,包括构造函数、初始化列表、聚合初始化等。以下是关于 C++初始化语法的具体说明: --- #### 1. **构造函数** 构造函数是一种特殊的成员函数,用于创建和初始化对象的状态。它可以有参数也可以没有参数,并且通常会执行一些必要的初始化工作。 ```cpp class MyClass { public: MyClass(int x, double y) : m_x(x), m_y(y) {} // 构造函数定义 private: int m_x; double m_y; }; ``` 构造函数的主要特点在于它的名称与类名相同,不返回任何值(即使是 `void`)。通过构造函数可以为类的成员变量赋初始值[^1]。 --- #### 2. **初始化列表** 初始化列表是 C++ 提供的一种机制,用于在构造函数中初始化成员变量。相比于在构造函数体内赋值,初始化列表能够提供更高的效率和灵活性,尤其是在处理常量成员或引用成员时更为重要[^4]。 ##### 特点: - 初始值是在内存分配之后立即赋予给成员变量的。 - 支持对常量成员、引用成员以及其他复杂类型的成员进行初始化。 ```cpp class MyClass { public: MyClass(const string& name, int age) : m_name(name), m_age(age) {} // 初始化列表 private: const string m_name; // 常量成员必须通过初始化列表初始化 int m_age; }; ``` 注意:如果类中有 `const` 或者引用类型的成员变量,则这些成员必须通过初始化列表来进行初始化,而不是在构造函数体内部赋值[^5]。 --- #### 3. **聚合初始化** 聚合初始化是一种简单而高效的初始化方式,特别适合于那些没有任何用户定义构造函数的标准布局类型(Standard Layout Types)。这种初始化方式允许我们直接使用大括号 `{}` 来为类的成员逐一赋值[^3]。 ##### 示例代码: ```cpp struct Point { int x; int y; }; Point p = {10, 20}; // 聚合初始化 ``` 从 C++11 开始,标准放宽了对聚合类型的限制,允许包含私有成员、默认构造函数等情况的存在。而在最新的 C++20 标准中,更是进一步扩展了聚合初始化的应用范围。 --- #### 4. **使用 `std::initializer_list` 进行批量初始化** C++11 引入了 `std::initializer_list`,这是一种专门设计的数据结构,旨在支持通过花括号 `{}` 方式对容器或其他集合类型进行初始化[^2]。 ##### 示例代码: ```cpp #include <vector> #include <string> std::vector<int> numbers = {1, 2, 3, 4, 5}; // 使用 std::initializer_list 初始化 vector std::string greeting = {"Hello", "World"}; // 字符串字面量数组 ``` 这种方式不仅简洁美观,还具有较高的运行时性能表现。 --- #### 5. **继承关系中的初始化顺序** 当一个派生类继承自基类时,在实例化过程中会按照如下顺序依次调用各个构造函数: 1. 基类的构造函数; 2. 派生类自身的成员变量初始化; 3. 派生类本身的构造函数主体。 需要注意的是,即使派生类未显式指定基类构造函数的调用,默认情况下也会自动调用基类的无参构造函数。如果有多个基类或者虚基类的情况,则需额外小心处理其初始化逻辑。 --- #### 总结 以上介绍了几种常见的 C++初始化方法及其适用场景。每种方法各有优劣,开发者应根据实际需求选择最合适的方案以确保程序的安全性、可读性和效率。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值