您的位置:

C++11新特性全面剖析

一、auto关键字

auto关键字是C++11新增的一种类型推导机制,可以让编译器自行推导变量的类型,从而简化代码书写。使用auto关键字定义的变量在编译器编译时会自动推导其类型,从而避免了代码中类型的重复书写。

// 使用auto关键字定义变量
auto i = 1; // 推导为int类型
auto d = 1.0; // 推导为double类型
auto str = "hello"; // 推导为const char*类型

使用auto关键字时要注意变量的初始化,因为编译器是通过变量的初始值来进行类型推导的。如果变量的初始值不明确,将会导致编译失败。

二、lambda表达式

lambda表达式是C++11新增的一种匿名函数定义方式,可以简化代码书写,提高代码的可读性和可维护性。lambda表达式定义的函数可以作为参数传递给其他函数,也可以直接在代码中进行调用。

// 使用lambda表达式定义一个匿名函数
auto add = [](int a, int b){return a + b;};
int result = add(1, 2); // 调用lambda表达式定义的函数获取结果

在使用lambda表达式时,可以使用捕获列表来捕获外部变量,以便在lambda表达式中使用。使用捕获列表可以让lambda表达式拥有更强的通用性和灵活性。

三、智能指针

智能指针是C++11新增的一种指针类型,采用RAII(资源获取即初始化)的机制管理指针所引用的对象的生命期,从而解决了内存泄漏等问题。使用智能指针可以避免一些常见的编程错误,提高代码的健壮性。

// 使用shared_ptr智能指针管理对象的生命期
std::shared_ptr objPtr(new TestObj());

  

使用smart_ptr定义智能指针时可以使用unique_ptr和shared_ptr两种指针类型。其中unique_ptr表示指针是唯一引用,不能共享;而shared_ptr可以被多个指针共享。

四、范围for循环

范围for循环是C++11新增的一种语法结构,可以循环遍历 STL 容器、数组等数据结构。与传统的for循环相比,范围for循环代码更加简洁、易读。

// 使用范围for循环遍历vector容器
std::vector numbers = {1, 2, 3, 4};
for(auto& num : numbers){
    std::cout << num << std::endl;
}

  

在使用范围for循环时,要注意避免对循环变量的修改,以免引发代码错误。

五、具有默认参数值的函数

具有默认参数值的函数是C++11新增的一种语法结构,可以为函数的参数提供默认的初始值。在调用函数时,如果不传递参数,则使用默认参数值。使用具有默认参数值的函数可以减少代码的重复书写。

// 使用具有默认参数值的函数
int power(int base, int exp = 2){
    int result = 1;
    for(int i = 0; i < exp; i++){
        result *= base;
    }
    return result;
}
int result1 = power(2); // exp参数使用默认值2
int result2 = power(2, 3); // exp参数使用传入的值3

在使用具有默认参数值的函数时,要注意设置默认参数值的位置,因为设置默认参数值的参数必须出现在不设置默认参数值的参数的后面。