【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
自己读书的时候是03年,学习c++也是差不多04年开始,到现在基本上20年了。这20年过程当中,其实c++的语言版本一直是在迭代当中的。早期的c++迭代还比较慢,但是11年之后,可能是与时俱进的需要,c++引入了很多其他语言的特性。对于这些新特性,使用上面一般自己还是比较偏保守的。但是,至少对coder来说,能够看懂别人的代码还是很重要的。
这一段时间学习树莓派4b,安装和移植了不少软件,也开始对c++新版本有了一些体会和认识。这里正好总结一下。
1、添加了新的头文件
编译过程中,发现新版本的c++,添加了好多不认识的头文件,比如说#include <filesystem>。一开始的时候,编译提示找不到,后来才知道,新版本的c++才有这个头文件。遇到这种情况,要么自己重写一下函数,要么update一下gcc的版本。
2、lamda函数
之前lamda函数只是在其他语言中看到过,比如python、javascript等等。现在c++也有了自己的lamda函数,大家把它看成是函数指针就可以了。
auto compare = [](int a, int b) ->int {return a > b ? a : b;};
int result = compare(1,2);
3、auto变量的使用
有的时候,不确定变量的类型,直接用auto代替了。看似是一个一劳永逸的做法。
4、循环的修改
之前的c++循环,和c语言差不多,一般都是for、while和do while。现在c++的循环改了一下,添加了一种冒号的形式。
int data[] = { 1,2,3,4,5 };
for (auto val : data)
{
std::cout << val << std::endl;
}
5、类里面模板的声明
新式的c++语法,特别是类里面的定义,猛一看上去,还以为有语法错误,其实也是一种新添加的声明格式。
class demo
{
public:
demo() {}
~demo() {}
template<typename t>
t compare(t a, t b)
{
return a > b ? a : b;
}
};
void process()
{
demo d;
auto result = d.template compare<int>(2, 1);
std::cout << result << std::endl;
}
这段示例代码里面,最神奇的就是这个d.template,一开始看的时候都以为是代码bug呢。
6、缺省模板
缺省模板其实老早就有,只不过平时看得少。真的见多了,才知道是什么含义,
template <typename T>
T compare(T a, T b)
{
return a > b ? a : b;
}
template <>
int compare(int a, int b)
{
if (a == 0 || b == 0)
{
assert(0);
}
return -1;
}
7、直接用stl创建多线程
之前我们不管是windows,还是linux,创建多线程的时候,都是用的os api函数。不过最新的c++标准里面,对应的stl已经可以支持多线程编写了。
#include <iostream>
#include <vector>
#include <thread>
void threadFunction(int threadID)
{
std::cout << "Thread " << threadID << " is executing." << std::endl;
}
int demo()
{
std::vector<std::thread> threads;
for (int i = 0; i < 5; ++i)
{
threads.push_back(std::thread(threadFunction, i));
}
for (auto& thread : threads)
{
thread.join();
}
std::cout << "All threads have finished execution." << std::endl;
return 0;
}
8、namespace的嵌套
还有一个印象比较深刻的内容,就是namespace的嵌套,比如像这样,这是之前没有看到过的,居然也可以编译通过,
namespace A::B::C
{
};
总结:
实际遇到的c++新特性还是蛮多的,大部分都能猜到它的意思是什么。是在理解不了的,一般也是通过搜索引擎,或者chatgpt review一下,看看是怎么一个情况。平时看到的时候,注意积累一下,没必要专门去学。至少保证自己可以学会、看懂,这就已经很好了。