C++11特性简述

Lambda表达式

        捕获列表+参数列表(没有参数可以省略)+返回值+函数体

        类成员函数中定义lambda表达式可以捕获this指针,但是没有捕获函数参数的时候捕获this也不能访问函数参数

        自动推导返回值:必须是唯一形式的返回值类型才能推导出来,也就是不能出现二义性,比如返回列表时,由于数组和链表都可以以列表的形式返回,所以无法自动推导出返回值类型,这时就需要自己手动声明一下返回值类型 "->返回值类型"

foreach和lambda表达式的联系

        foreach 和 lambda 的联系在于,lambda 经常作为回调函数在 foreach 循环中使用。通过将 lambda 表达式与 foreach 结合使用,可以在循环中直接处理每一个元素,简化代码并使其更具表达力。

#include 
#include 
#include 

int main() {
    std::vector vec = {1, 2, 3, 4, 5};

    // 使用 std::for_each 和 lambda 表达式
    std::for_each(vec.begin(), vec.end(), [](int& num) {
        num *= 2;  // 对每个元素执行操作
    });

    // 输出修改后的容器
    for (auto num : vec) {
        std::cout << num << " ";  // 输出:2 4 6 8 10
    }

    return 0;
}

final关键字

修饰类:类不能被继承

修饰虚函数:虚函数不能被重写

(虚函数表是编译阶段生成的,所有对象共享一个虚函数表)

右值引用

匿名对象:只存在在当前行

使用右值引用引用右值后,右值的生命周期延长了

右值引用是左值,左值引用也是左值

引用折叠:当在模版中使用自动推导时,如果是auto&&类型,传入左值就是左值引用,传入右值就是右值引用

C/C++中空指针的区别 (nullptr_t类型的引入)

        nullptr和NULL和0和(void*)0

        C语言中void*0可以隐式转换成其他类型的指针,C++中不可以,在C++11之前,通常使用NULL或者0代表空指针,但是当0或者NULL作为函数参数时可能会造成歧义,因为编译器无法分辨到底是指针类型还是整数类型,所以C++11引入了nullptr_t类型,此类型的唯一值是nullptr,代表空指针,避免了二义性。

C++11特性简述_第1张图片

void display(int value) {
    cout << "Integer: " << value << endl;
}

void display(char* str) {
    if (str)
        cout << "String: " << str << endl;
    else
        cout << "Null String" << endl;
}
display(0);  // 输出 "Integer: 0"
display(NULL);  // 有可能引发歧义
display(nullptr);  // 输出 "Null String"

 在模版编程中,nullptr可以帮助我们为了处理类型为空指针时的模版特化

template
void debug(T ptr) {
    cout << "General template" << endl;
}

template<>
void debug(nullptr_t) {
    cout << "Specialized template for nullptr" << endl;
}

debug("Hello");  // 输出 "General template"
debug(nullptr);  // 输出 "Specialized template for nullptr"

判断程序是C还是C++

#ifdef __cplusplus
printf("C++");
#else
printf("C");
#endif

你可能感兴趣的:(c++,开发语言)