小松520 发表于 2023-10-3 19:21:48

Modern C++ 与 C++ 有什么区别?

这几天听说有一个 Modern C++,有点懵,为什么 C++ 还能分类,
打算通过《C++ primer plus》去学 C++,但是这本书会涉及到Modern C++ 吗,
还想问一下,如果想从事游戏开发,这个 Modern C++ 和 C++,学哪一个更好呀

mge192003 发表于 2023-10-3 19:22:04

感觉不是写库的人也不用关心那些邪教写法,等真有业务需求的时候比如把js嵌入cpp就知道那些语法的用处了
很多库都是cpp对内不对外,邪教写法就是为了把那复杂玩意包在库里,让调api的人省心
而且模板和宏是cpp能突破一些语言限制的好工具,cpp可能不是那么智能但是比较万能
我觉得还是cpp的编译器做的太好了,有的错误编译期看不出来会崩在运行时,就应该学隔壁rust,编译器会暴打菜鸡程序员

小松520 发表于 2023-10-3 19:22:25

Modern C++实际上通常说的是使用C++11加入的一些语法糖,以及移动,当然,模板及其工具的改进和多线程其实也算。《C++ Primer Plus》则一点和Modern也不沾边。

Oracle 发表于 2023-10-3 19:22:58

Modern C++ 大大提高了开发效率,这点毫无凝问!
说下提升开发效率的一些语法糖:

1. if/switch 初始化语句
//before
auto*tmp = parseExpression();
if(tmp!=nullptr){
    work();
}
//after   
if (auto* tmp = parseExpression(); tmp != nullptr) {
    work();
}2. 结构化绑定
std::tuple<int,string> nextToken(){
    return {4,"fallthrough"};
}

//before
int main() {
    auto token = nextToken();
    std::cout<<std::get<int>(token)<<","<<std::get<std::string>(token);
    return 0;
}
//after
int main() {
    auto = nextToken();
    std::cout<<tokenType<<","<<lexeme;
    return 0;
}
3. std::string_view
//before
void isKeyword(const std::string & lit){
    work();
}
//after
void isKeyword(std::string_view lit){
    work();
}
4. 内联变量
// A.h inline int k = 10; //不需要为一个简单的变量分一个.cpp写定义了
5. 折叠表达式和泛型lambda
//before
if(x=='x'||x=='X'||x=='e'||x=='E'||x=='.'){
    work();
}

//after
static auto anyone = [](auto&& k, auto&&... args) ->bool { return ((args == k) || ...); };
if(anyone(x,'x','X','e','E','.')){
    work();
}
6. 继承构造函数
struct Base{
    Base(int a,char b,double c, std::string d,float f)
    :a(a),b(b),c(c),d(std::move(d)),f(f){}

    int a;
    char b;
    double c;
    std::string d;
    float f;
};

//before
struct Derive : public Base{
    Derive(int a,char b,double c, std::string d,float f):Base(a,b,c,d,f){}
};

//after
struct Derive : public Base{
    using Base::Base;
};
7.+lambda转换
对lambda使用一元+表达式可以将它转换为普通函数指针
// before
int8_t (*CreateLonglink)(const std::string& name, const std::string& host,
const std::vector<uint16_t> ports, const std::string& debugip)
= +[](const std::string& name,
                         const std::string& host,
                         const std::vector<uint16_t> ports,
                         const std::string& debugip)->int8_t{
   
    ...
    return 0;
};
// after
auto CreateLonglink= +[](const std::string& name,
                         const std::string& host,
                         const std::vector<uint16_t> ports,
                         const std::string& debugip)->int8_t{
   
    ...
    return 0;
};

来源:作者:kelthuzadx 链接:https://www.zhihu.com/question/298981020/answer/519864425 来源:知乎推荐阅读书单
正如侯捷老师所说C++ 相关的书籍也非常多,如天上繁星。 广博如四库全书者有 《The C++Programming Language》 《C++ Primer》,深奥如山重水复者有《The Annotated C++ Reference Manual》、《Inside The C++ Object Model》,细说历史者有《The Design And Evolution Of C++》、《Rumiations on C++》,独沽一味者有《Polymorphism in C++》、《Genericity in C++》,独树一帜者有《Design Patterns》、《C++ FAQs》,程序库大全有之《The C++ Standard Library》.....
至于书单的话,可以看下这个C++ 最全书单,包含几十本经典的PDF和下载方式:
华为最牛逼的c++ 基础与提高PDF​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd(PS:侯捷 C++ 视频课程一直都被看过的同学广为推荐,最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了,于是自己搜集了一套非常全的视频,大家赶紧去下载保存备用
侯捷C++全套视频|含下载方式​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd他们让知识的传播变得更加的便捷,降低了后来者的学习门槛,当然啦也变相加重了内卷化.
最近很多知友问我大厂面试的核心知识点,东哥熬夜整理出来了9大核心知识点,需要的自取:
BAT大佬整理的进大厂必看秘籍!​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487114&idx=1&sn=3daf22898b8149910b297f48376395a3&chksm=fdb3f054cac47942e2dcd43ba8a33ab414e0dafb2300ac2eebc9fe18af5cd9f4618b3b4f3266#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487114&idx=1&sn=3daf22898b8149910b297f48376395a3&chksm=fdb3f054cac47942e2dcd43ba8a33ab414e0dafb2300ac2eebc9fe18af5cd9f4618b3b4f3266#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487114&idx=1&sn=3daf22898b8149910b297f48376395a3&chksm=fdb3f054cac47942e2dcd43ba8a33ab414e0dafb2300ac2eebc9fe18af5cd9f4618b3b4f3266#rd另外,我当初在准备各大公司技术笔试的时候刷了大量的算法题,其中就是参考了一本谷歌大神的LeetCode刷题笔记,帮我整理了解题思路,归纳了出刷题方法,非常不出错,转给需要的同学:
BAT大佬写的Leetcode刷题笔记,看完秒杀90%的算法题!​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247485348&idx=1&sn=02ede6b715b20a6b981af1d021d77d5d&chksm=fdb3f97acac4706cc193bec80b984255bb33db2b35366682bd566280326b7029f1dae632abb2#rd最后给大家介绍一份计算机经典书籍,送大家一份硬核书籍资源:读大学跟工作期间,我买了很多书,大部分是一些技术书籍,也收集了这些书籍的电子版,都在这里,现在免费share给大家,包括了计算机类常用电子书,包括C,C++,Java,Python,Java,Linux,Go等,希望大家能认真阅读。点击下方链接直达获取:
计算机经典必读书单(含下载方式)​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487238&idx=1&sn=c63594d794bed494ff91bebd4c8de37c&chksm=fdb3f1d8cac478ce0bb20b69a930567c8790e1c3fe4629aacb805a5c2ac9f39035772855738e#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487238&idx=1&sn=c63594d794bed494ff91bebd4c8de37c&chksm=fdb3f1d8cac478ce0bb20b69a930567c8790e1c3fe4629aacb805a5c2ac9f39035772855738e#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487238&idx=1&sn=c63594d794bed494ff91bebd4c8de37c&chksm=fdb3f1d8cac478ce0bb20b69a930567c8790e1c3fe4629aacb805a5c2ac9f39035772855738e#rd码字不易,硬核码字更难,希望大家不要吝啬自己的鼓励,给我 :
@码农出击
一个点赞,鼓励下我!

肝硬化 发表于 2023-10-3 19:23:43

一般 Modern C++ 是指的C++11以后的C++,因为 C++11 变动挺大。其实要说 Modern C 一般也是指 C99/C11 以后。
现代c++区别
1、大括号可以指定容器的初始内容>。
2、大括号可以用来为非静态成员指定默认初始化值,也可以用’='的初始化语法,不能用()。
3、不可复制对象(只移类型)可以用大括号和小括号进行初始化,却不能使用"=":
4、大括号禁止內建型别之间进行隐式窄化型别转换,小括号和=不会进行隐式窄化类型检查。
5、大括号能够防止解析语法带来的错误。
6、大括号的缺陷在于,对于auto类型而言,auto推导结果为std::initializer_list,这样的结果让你出乎意外。另外针对有将std::initializer_list作为构造函数的形参的类而言,当用大括号进行初始化时,会优先匹配std::initializer_list作为形参的构造函数,而不会选择其他有着貌似更加匹配的重载版本。
空指针优先选用nullptr,而非0或null

nullptr的优点在于:它不具备整型型别。
nullptr的实际型别是std::nullptr_t。型别std::nullptr_t可以隐式转换到所有的裸指针型别。在模板推导过程中,0会被推导成整型,null被推导成某种整型。
避免在整型和指针型别之间重载。
优先选用别名声明,而非typedef

别名声明可以直接模板化,typedef就不行,需要通过嵌套在模板化的struct里的typedef才能硬搞出来的东西。
优先选用限定作用域的枚举类型,而非不限作用域的枚举型别。
1、 限定作用域的枚举型别仅在枚举型别内可见。它们只能通过强制型别转换至其他型别。
2、不限定作用域的枚举型别在定义枚举的作用域内可见。不限定作用域的枚举型别会发生隐式转换。
3、限定作用域的枚举型别和不限范围的枚举型别都支持底层型别制定。限定作用域的枚举型别默认底层型别为int,不限作用域的枚举型别没有默认底层型别(编译器通常会选取足够表示枚举量取值的最小底层型别)。
4、限定作用域的枚举型别总是可以进行前置声明,而不限范围的枚举型别却只有在指定了默认底层的前提下才可以进行前置声明。
优先选用delete删除函数,而非private未定义函数

1、习惯上删除函数会被声明为public,而非private。(这么做的原因是编译器报错会显示相关函数已经被删除,而如果将删除写在private,则编译器会优先检查函数的访问权限)。
2、任何函数都可以删除,包括非成员函数和模板具现。
3、模板特化是必须在名字空间作用域而非类作用域内撰写。
优先选用delete删除函数,而非private未定义函数

1、习惯上删除函数会被声明为public,而非private。(这么做的原因是编译器报错会显示相关函数已经被删除,而如果将删除写在private,则编译器会优先检查函数的访问权限)。
2、任何函数都可以删除,包括非成员函数和模板具现。
3、模板特化是必须在名字空间作用域而非类作用域内撰写。
为所有派生类中有意重写的函数添加override声明

派生类虚函数重写需满足以下要求:
1、基类中的函数必须是虚函数
2、函数名字必须完全相同。
3、函数形参必须完全相同。
4、函数常量性(constness)必须完全相同
5、函数返回值和异常规格必须兼容。
6、函数引用饰词必须完全相同。
只要函数不会发射异常,就为其加上noexcept声明

1、noexcept 声明是函数接口的组成部分(调用方对其可能有依赖)。
2、相对于不带noexcept声明的函数,带有noexcept声明的函数有更多机会得到优化
3、noexcept性质对于移动操作、swap、函数释放函数和析构函数最有价值。
4、大多数函数都是异常中立的、不具备noexcept性质。
我这里整理学习近百本计算机经典书籍,包括各种编程语言,算法,网络编程,数据库,分布式等等各种技术,面试找工作的资料汇总都打包放在这了!
书单下载地址:
计算机经典书籍​(内含下载方式)同学们如果觉得有帮助的话,不要白嫖盼盼,给盼盼点一个赞吧,这样可以让跟多的同学看到!


http://pic1.zhimg.com/50/v2-907838a6045bb9fc80aa560a7275da20_720w.jpg?source=1940ef5c
Update

盼盼总结的c++全面学习路线和学习资料,希望可以帮助到大家!!
我是女生选的软件工程,真的感觉压力很大很大,不知道怎么办了....?盼盼的自己的学习经验和学习路线分享,帮助了很多小伙伴!
大一新生,计算机专业有什么血泪建议吗?

bigshuo007 发表于 2023-10-3 19:24:10

写在前面的话

我学习 C/C++ 十多年了,目前在大厂做架构,深知新手学习 C/C++ 和基础原理知识的重要性,因此特地给 C/C++ 开发的同学精心准备了一份优质学习资料————CppGuide,内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。
CppGuide 学习资料
http://pica.zhimg.com/v2-dc9a3fa1c11fa0ca302848864d3c80be_r.jpg?source=1940ef5c

http://picx.zhimg.com/v2-f72b3e2d33ac59f276518e3f80ef9abe_r.jpg?source=1940ef5c

一、什么是 Modern C++ 以及主流编译器对 Modern C++ 的支持程度

C++11标准是 C++ 语言发展史上具有里程碑意义的一个版本,我们把 C++11 及以后的 C++14、C++17、C++20 等标准称之为 Modern C++ 标准,使用这个标准引入的新增 C++ 特性称之为 Modern C++,而 C++11 之前的 98 和 03 标准则不是。
Modern C++ 主要改进了之前的C++ 98/03存在的两大问题:

[*]废弃了C++98/03标准中一些不实用的语法和库(如std::auto_ptr),改进或者增强了C++ 98/03标准中一些语法元素的用法(如auto 关键字、统一类的初始化列表语法),新增了一些其他编程语言早已经支持的关键字和语法(如final关键字、=default语法 、=delete语法);
[*]开始在语法和自带的标准库的层面上增加对操作系统的功能的支持(如线程库、时间库)。之前很多功能的实现,C++语言本身是无法支持的,必须依赖使用原生的操作系统的API函数,导致开发者需要编写大量平台相关的代码。
变化最大的标准是 C++11,虽然后来又产生了 C++14、C++17 以及 C++20 标准,但它们都是对 C++11 作小范围的修改和扩展,其主要内容还是继续完善一些特性和进一步提高一些标准库的性能。由于C++ 11新增了大量方便开发的功能与特性,支持C++11标准的编译器(如VC++12、g++ 4.8)一经发布,立即被广大开发者和使用C++的企业广泛采用。
对于 MSVC 编译器,支持 C++11 新标准的最低版本是 VC++12(随 Visual Studio 2013 一起发布,Visual Studio 以下简称 VS),VS 2015 支持部分 C++14 特性,VS 2017 完美支持 C++14和部分 C++17 特性,VS 2019 完美支持 C++17 大多数语言特性。
对于gcc/g++编译器,支持 C++11 新标准的最低版本是 gcc/g++ 4.8,支持C++14 是 gcc/g++ 4.9,gcc/g++ 7.3 完美支持 C++17 大多数语言特性。
各个编译器对于C++11/14/17语法特性和标准库支持情况,完整列表可参考:https://en.cppreference.com/w/cpp/compiler_support。
对于某个支持 C++11/14/17 语言的标准的 Visual Studio 版本,你一般不需要做任何特殊设置即可使用新语言标准支持的语法特性和库功能,当然你也可以通过设置指定具体的语言规范版本,以 Visual Studio 2019 为例,新建一个 C++ 项目之后,选中该项目,在弹出的右键菜单中选择【Properties】菜单项打开该项目的【属性设置】对话框,如下图所示:

http://picx.zhimg.com/v2-14219da6f28c14f500848ea9145901d9_r.jpg?source=1940ef5c

http://picx.zhimg.com/v2-81f0888c25b4b782723b386bae7848fe_r.jpg?source=1940ef5c
然后选择【C/C++】- 【Language】- 【C++ Language Standard】,在弹出的下拉菜单中选择你需要的 C++ 标准即可:

http://picx.zhimg.com/v2-d5b9315b0e153b415a04e0ab4f5cfb38_r.jpg?source=1940ef5c
这里需要说明一下,选项 Default 在 VS 2019 中即对应使用 C++ 14 规范标准,选项 Preview - Features from the latest C++ Working Draft(/std:c++ latest) 即使用当前最新的 C++ 标准(这里是 C++20),当 Microsoft 完成 C++20 标准中所有的实现时,这里会多出一个选项,即 ISO C++20 Standard(/std:c++20)。
对于 gcc/g++ 编译器(最低版本 4.8),如果要使用 C++11/14/17 语言规范,则需要在编译时设置相应的选项值。例如将test.cpp文件编译成名为test的可执行文件,同时需要C++ 11语言规范支持,则使用:
g++ -g -o test test.cpp -std=c++11在使用Makefile文件编译项目时可以这样指定:
make CXXFLAGS="-g -O0 -std=c++11"在使用cmake编译项目时可以在CMakeLists.txt文件中添加如下行:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -O0 -Wno-unused-variable")-std 选项的值可以按需设置成 c++14 或 c++17。
对于 gcc/g++ 7.3 及以上版本,由于编译器本身就支持包括 C++17 在内的所有语言特性,因此如果代码中用到某个特性,由于编译器本身就支持,可以不必使用 -std 选项指定具体的语言标准。

二、 学习 C++ 语法和语言特性


http://picx.zhimg.com/v2-d3d65d11dc7b15a390494def329dff4e_r.jpg?source=1940ef5c
如果想系统地学习 C++,C++98/03 中 C++ 语言的基本知识需要逐个掌握,包括但不局限于:

[*]指针和引用的概念
[*]指针与内存关系
[*]程序编译过程,静态链接库和动态链接库
[*]static、const、#define的用法和区别
[*]C和C++区别
[*]内存中的栈和堆分配
[*]面向对象理解
[*]访问限定符 public/protected/private
[*]构造函数/析构函数/拷贝构造
[*]多态
[*]虚函数与纯虚函数、虚函数实现机制、虚函数表
[*]继承原理、虚继承、菱形继承
[*]new/delete和malloc/free
[*]重载、重写和覆盖
[*]类型转换方式
[*]RAII 与 pimpl 惯用法
[*]内存溢出和内存泄漏
[*]STL标准模板库
[*]迭代器、空间配置器理解
[*]常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap
内容有点多,只有理解了,才能记得住,关于 C++ 语言背后的实现原理可以看看侯捷老师翻译的《深度探索 C++ 对象模型》一书。
链接: https://pan.baidu.com/s/1eBBtBYCA2asEJpLiUYQ9uQ提取码: 959g想掌握一些常用的 C++ 编码技巧,推荐阅读《提高C++性能的编程技术》,这本书很薄,但是内容都比较实用,看起来比较轻松。
链接: https://pan.baidu.com/s/1XCE9WV53GE8DPQXC2sF8ZQ提取码: 6bp9可用于工程实践的 C++ 书(例如如何结合 C++ 语言特性设计出优雅而鲁棒的 C++ API、如何优雅地组织和管理一个大型 C++ 工程等)推荐《C++ API 设计》《大规模 C++ 程序设计》:
链接: https://pan.baidu.com/s/1hkleT0kUgCCPyR9RVH4fMA 提取码: q802
链接: https://pan.baidu.com/s/1P4iJ3HfJi0EdHJLUPD9bKA 提取码: m3fnModern C++中,C++11/14/17 新标准已经成为主流,这块也要熟悉,要熟悉新标准常用的语法与新功能,包括但不限于:

[*]左值/右值/std::move/std::forward
[*]统一的类成员初始化语法与 std::initializer_list
[*]注解标签(attributes)
[*]final/override/=default/=delete 语法
[*]auto 关键字
[*]Range-based 循环语法
[*]结构化绑定
[*]stl 容器新增的实用方法
[*]std::thread
[*]线程局部存储 thread_local
[*]线程同步原语 std::mutex、std::condition_variable 等
[*]原子操作类
[*]智能指针类
[*]std::bind/std::function
C++11/14 网上的资料已经很多了,C++17 的资料不多,重点掌握的还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的书:

[*]《深入理解 C++11:C++11 新特性解析与应用》
[*] 《深入应用 C++11:代码优化与工程级应用》
[*] 《C++17 完全指南》
[*]《Cpp 17 in Detail》
链接: https://pan.baidu.com/s/1K_Ous0sOWEN_7cVisGvBQA
提取码: lsk8
http://picx.zhimg.com/v2-8c998e728625d2ed7c58e0ecd149253b_r.jpg?source=1940ef5c

另外,Effective C++ 系列的作者 Scott Meyers 又写了本介绍现代 C++ 各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下:
链接: https://pan.baidu.com/s/1HA1INg5cdHIZoQLUCgDHxQ 提取码: ghl9
链接: https://pan.baidu.com/s/14n2gYKKYCL-qrt2sCPI6tA 提取码: 7kjw三、 学习 C++ 相关的开发工具链

学习 C++ 最好的方法是多调试。学习 C++ 的相关的 IDE 开发环境,Windows上我推荐 Visual Studio,Mac 上可以使用 Subline 或者 VSCode,如果你最终的程序需要在 Linux 跑,你需要熟悉 cmake/make/gcc/g++/gdb 工具链,vim 的基本操作也要熟悉,但不建议直接在 vim 中写代码,实际企业级开发也没人会这么做。这里强调一下,如果可能,至少要熟悉 Visual Studio 和 gdb 调试,调试需要掌握哪些内容呢?
建议掌握:

[*]如何启动和结束调试
[*]如何添加/删除/启用/禁用断点(包括普通断点、条件断点和数据断点)
[*]如何查看当天断点下的调用对战
[*]如何查看程序运行过程中的线程信息(这块可以放到下文再学)
[*]如何查看某个变量的内存值
注意:如果你想胜任 Linux C/C++ 后台开发, 一定要熟练使用 gdb 调试 ,我推荐《gdb 高级调试实战教程》,电子书下载链接:
链接:https://pan.baidu.com/s/1b29dGWOq5KPekiGPMQ4thA
提取码:puco 以下是《gdb 高级调试实战教程》目录:

http://picx.zhimg.com/v2-daf060f4fcc8c4dff3d53fb651ef0b79_r.jpg?source=1940ef5c

http://pica.zhimg.com/v2-07ceefc68651f0bf179e7dd9815ee97b_r.jpg?source=1940ef5c

掌握了一门编程语言加其开发的工具链,你的想法就可以通过动手变为现实了。
熟悉了 C/C++ 语言和其相关的开发工具链,接下来你可以根据你的兴趣学习相关的开发知识了。

三、可用于实战的 Modern C++ 项目

C++11/14/17 的语法虽然很实用,但是需要一定的练习才能掌握,推荐几个学习 C++11/14/17 的开源项目:

[*]Filezilla
filezilla 是一款开源的 FTP 软件,其源码下载地址如下:
链接: https://pan.baidu.com/s/1Efr8mEzRLgFqFvmRfX2z4Q密码: rufj2. uWebSocket 网络库
uWebSocket 是一款开源的 WebSocket 库,最新版使用了大量 C++17 的语法,代码量很少,既可以学习 Modern C++ 的一些用法,也可以学习网络框架编写和协议的设计。
下载地址:
https://github.com/uNetworking/uWebSockets3. TeamTalk 的 PC 端
TeamTalk 是蘑菇街开源的一款用于企业内部的即时通信工具,其下载地址是:
https://github.com/balloonwj/TeamTalk/tree/master/win-client 4. 最后是我的开源 Flamingo IM
https://github.com/balloonwj/flamingo
完整的书单

上文提到的书及完整的书单在这里:
计算机必看经典书籍(含下载方式)总之,C++ 是一门非常讲究深度的编程语言,一定要结合程序背后运行的操作系统原来来学习和理解,这样才能学好。

原创不易,如果觉得有帮助,请给 @张小方 点个赞~~
页: [1]
查看完整版本: Modern C++ 与 C++ 有什么区别?