C++11特性简述
Lambda表达式
捕获列表+参数列表(没有参数可以省略)+返回值+函数体
类成员函数中定义lambda表达式可以捕获this指针,但是没有捕获函数参数的时候捕获this也不能访问函数参数
自动推导返回值:必须是唯一形式的返回值类型才能推导出来,也就是不能出现二义性,比如返回列表时,由于数组和链表都可以以列表的形式返回,所以无法自动推导出返回值类型,这时就需要自己手动声明一下返回值类型 "->返回值类型"
foreach和lambda表达式的联系
foreach 和 lambda 的联系在于,lambda 经常作为回调函数在 foreach 循环中使用。通过将 lambda 表达式与 foreach 结合使用,可以在循环中直接处理每一个元素,简化代码并使其更具表达力。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> 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,代表空指针,避免了二义性。
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<typename T>
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