精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
最近看了些C++11标准、C++14标准、C++17标准和C++22标准的部分代码,里面臭长的类型名,把简单的类型全部代替化后的代码,对初学者真是不友好,比如指针*,里面换成了Ptr,这对适应了的朋友来讲确实不难,还有好处,但是对于不适应的或者初学者来说,就很困难了,所以就想说些关于C++复杂性探讨和C++疑难点分析的话。
做为创业的老板,为了完成项目必须要接触多个语言,Python、C#、Go、VB、Java、JavaScript、Object-C和Swift都用过,说真的C++越来越复杂,完全脱离了简单易用这个层次。
从书籍上看,C++Primer比C++沉思录厚很多,C++Primer后面的STL、流、容器和泛型都是疑难点,对初学者来说并不好学,这些知识点如果在大学里没有团队讨论,很难掌握,很难使用上。
而C++新标准里加的类,更夸张,比如:future、promise 和 packaged_task,等——稍稍更高级的并发,并发理解这些需要操作系统里进程和线程基础没有基础肯定学不会,所以很多非专业的学生肯定学不成,一些教育机构也不会教。
下面讲个具体的疑难点,比如C++新标准里的高精度时间例子:
#include <iostream> #include <chrono> int main() { auto start = std::chrono::high_resolution_clock::now(); // Code to benchmark auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> duration = end - start; std::cout << "Execution time: " << duration.count() << " seconds\n"; return 0; }
里面函数调用和类对象定义使用了三个域访问符::,现在虽然各类编辑器都有符号自动提示完成功能,但是这么长确实在第一印象上非常不好。而用API获取时间毫秒,用GetTickCount64就非常简单,返回的是ULONGLONG,类型上也好理解。
不过要想C++可以跨平台移植,还要想使用高精度时间,必须要用chrono的类。不想写这么长,试试用using,看chrono里有没有命名空间,用using std::chrono来导入命名空间,导入后可以直接使用类型high_resolution_clock。
新标准里涉及到的还有正则也是非常难学难用,但是处理字符串分析,正则最简洁直观,比如httplib的代码:
static const std::regex re_rfc5987_encoding( R"~(^UTF-8''(.+?)$)~", std::regex_constants::icase); std::smatch m2; if (std::regex_match(it->second, m2, re_rfc5987_encoding)) { file_.filename = decode_url(m2[1], false); // override... } else { is_valid_ = false; return false; }
字符串前的R在我写本文时也是第一次见到,意思里原文不变,不管转义,因为正则规则字符串里有可能和转义冲突,所以必须带R来修饰为原文字符串。
it是迭代器的知识点,这个不难理解。正则的功能是按正则规则字符串找满足与否,这个规则是用if else判断不出来的,用了正则处理流程很简单,但是正则字符串很难记,如果不常用,记了也容易忘记,但如果要应聘大公司,正则规则肯定要背。
C++把复杂的类直接暴露给用户使用,在第一版本的STL里就种下了坑,C++复杂性探讨的结果就是如此。我用过C#,里面的并发类也很麻烦,但是微软封装的好,用起来简单。C++标准可能不是一家公司说了算,有没有可能是为了实现而实现,不是为了用户而实现。
所以现在很多追求性能的语言在快速增长,比如Rust呼声很高。