1 across 2020-11-11 10:29:22 +08:00 首先,C++不是 Python,学习路线就是从 03 一路学到 14,再之后看你用不用得上了。 |
![]() | 2 linux40 2020-11-11 10:30:43 +08:00 不是能不能,而是最好直接从 20 开始。 |
3 jjianwen68 2020-11-11 10:36:07 +08:00 但很多实际需要 c++的,还不会直接使用 c++20,一般还是没有使用这么新的编译器 |
![]() | 4 shiltian 2020-11-11 10:37:05 +08:00 越来越复杂是真的,越来越好用也是真的。要真想深学 C++,基础的那些东西(比如对象模型)还是少不了的,但是这些东西又和哪一代 C++ 没有太大的关系。新特性更多的是语法糖还有更加完善的 STL 而已。 |
![]() | 6 luoqeng 2020-11-11 10:45:08 +08:00 完全可以 |
![]() | 7 tamlok 2020-11-11 10:47:59 +08:00 via Android 不能~编译器都支持了吗? |
![]() | 8 llvm98 2020-11-11 11:06:23 +08:00 ![]() 我个人感觉的话,如果 C++ 想学明白,历史包袱是很难避免的(除了一些语法糖),不过还是要看自己的学习方法,的确有些人是把 C++ 当 Python 学,尤其是一些参加竞赛的同学,先用熟 API 再深入学习,也学的很好,但我自己经验来讲,学了 C 和操作系统之后,再按自己需求去一点一点地学 C++ 就会感觉比较自然。不过话说回来,按版本学的我还没怎么见过,哈哈哈 |
![]() | 9 gainsurier 2020-11-11 11:18:00 +08:00 ![]() C++ Primer 第 6 版快来了,基于 20 |
![]() | 10 Alexhohom 2020-11-11 11:33:25 +08:00 并不能 |
11 Wirbelwind 2020-11-11 12:07:23 +08:00 可以 不要写 oop |
12 Cbdy 2020-11-11 12:09:58 +08:00 首先,你要找到一个编译器支持 C++20 |
![]() | 13 raaaaaar 2020-11-11 12:10:05 +08:00 via Android 。。我就刷刷算法题,就调调 API,真 c with class 。。 |
![]() | 14 wtsamuel 2020-11-11 12:33:10 +08:00 你只要吧 c+ 当作 c with class,哪个版本都好用 |
![]() | 15 cmdOptionKana 2020-11-11 12:42:28 +08:00 学习可以,但具体工作的时候还是看项目的历史包袱。 |
16 Tony042 2020-11-11 13:00:23 +08:00 C++学 17,但是主要学 11,20 的话各大编译器支持还不完全 |
17 ppphp 2020-11-11 13:00:37 +08:00 真想学好可以直接从 rust 开始。。。 |
![]() | 18 newmlp 2020-11-11 13:02:18 +08:00 没问题,如果仅仅是自己学一下 |
19 luplus 2020-11-11 13:20:17 +08:00 现在 11 用的最多,20 不知道要多久才能用上,而且都是一些特性的改变,你把前面基础弄扎实,其他的都好说 |
20 songtinhuang 2020-11-11 13:34:08 +08:00 先探索探索可行性。 Cpp20 估计不行,要等 GCC 或者 clang 或者 MSVC 哪家先支持完整的 CPP20 。 另外,C++之父是建议先学 modern cpp 的。我推荐你从 17 开始。 |
![]() | 21 xdeng 2020-11-11 13:48:23 +08:00 使用过程中 难免会遇到 C89 等旧的库的。 |
![]() | 22 GromHellscream 2020-11-11 13:50:18 +08:00 我是从 11 开始学的 |
23 Stoulla 2020-11-11 14:21:27 +08:00 via Android 建议从 14 或者 11 开始学 |
![]() | 24 nicebird 2020-11-11 14:31:38 +08:00 11 开始会好点,用的比较广。 |
![]() | 25 ysc3839 2020-11-11 14:39:03 +08:00 ![]() 个人项目的话是应该的,许多特性用起来挺爽的。 举个典型例子:调用一些库,需要传递一个 buffer 进去接收字符串并保存到 std::string 的情景。 以前经常看到这种写法: auto len = get_string_length(); char* buffer = new char[len]; get_string(buffer); std::string result(buffer, len); delete[] buffer; return result; 但是从 C++ 17 开始,可以这么写: auto len = get_string_length(); std::string result; result.resize(len); get_string(result.data()); return result; 后者与前者相比:代码更加简洁,少了一次拷贝,不需要手动释放内存,在遇到异常时不会导致内存泄漏。 另外按照 Stack Overflow 上的说法,自 C++11 开始就能用这种方法了,要把 string.data() 换成 &string[0] https://stackoverflow.com/questions/1042940/writing-directly-to-stdstring-internal-buffers |
![]() | 27 rogerchen 2020-11-11 15:43:29 +08:00 @ysc3839 result.data() 就只在 since 17 until 20 这一个小时间窗口里返回了一个可写的 CharT*,之前是 const CharT*,之后是 constexpr CharT*,怕是都不能用你这个方法了。至于 &string[0],只要 cpp 还是 zero overhead,C++哪个版本都可以怒草类型系统。 |
![]() | 28 ysc3839 2020-11-11 16:18:56 +08:00 via Android @Cryse 我好像没看过专门讲解新特性的书籍或者文档,基本都是从别的项目或者 en.cppreference.com 了解到的。 如果要推荐的话可以看看这个 https://changkun.de/modern-cpp/ |
29 ysc3839 2020-11-11 16:23:19 +08:00 via Android @rogerchen constexpr 修饰的是函数,不是返回值类型,返回值类型还是 CharT*。 至于 &string[0],Stack Overflow 上的说法是因为 C++11 之前标准没有规定一定要连续存储,(&string[0]) + 1 不一定等于 &string[1],并不保证可用。 |
![]() | 30 johnli 2020-11-11 17:49:15 +08:00 ![]() |
31 GeruzoniAnsasu 2020-11-11 18:50:48 +08:00 @johnli hhh 其实还挺科学的,毕竟 rust 是最新的“想要集大成”的复杂语言,跟 c++努力方向一致 |
![]() | 32 liuguangxuan 2020-11-11 19:10:03 +08:00 via Android @gainsurier 哪里看到的消息,老哥。 |
34 Jirajine 2020-11-11 19:19:01 +08:00 via Android ![]() 照你这样说直接学 rust 就完了,cpp 一路都是缝合过来的。 |
35 owt5008137 2020-11-11 23:27:16 +08:00 via Android 不能。 目前基本上没有支持 c++20 特性的生产环境。 目前还没有哪个编译器能完整支持 c++20 。 目前还没有哪个编译器对 c++20 支持的特性完全进入了非体验阶段。 C++20 很多设计也是有历史包袱的,而且也是为了解决之前的问题,不了解一下根本不知道为嘛现在设计成这样。 如果想要完全丢弃历史包袱,不如就像上面很多人说的直接学 Rust |
36 neoblackcap 2020-11-12 03:29:42 +08:00 @songtinhuang 最快应该是 clang 吧,我看他们挺积极的。不过嘛,完整支持就不好说。我看历来都有各种各样的特性不会被实现 |
37 js8510 2020-11-12 04:57:30 +08:00 ![]() 我是在现在公司入职后学的 C++,我也在内部问过类似问题。不同大佬给了我不同甚至相反的意见。C++ 真的 很特别,你要问 best practices 或者 principle, 其他语言一般都有一致的答案,但是 c++往往会出现分歧。我的建议是看看就好,凭自己感觉选在。重点是开始做。 以我学习不同语言的经验,我当时就直接开始做。写代码,开始是内部课程的作业,找组里的人给我 code review. 然后是一些简单的业务逻辑,有其他人给我 reivew 慢慢就上手了。 |
![]() | 38 PepperEgg 2020-11-12 09:00:09 +08:00 11 起步。20 太新,没有多少编译器支持全部特性。另外 17 也是不错的选择。 |
![]() | 39 auto8888 2020-11-12 09:09:31 +08:00 建议 C11 关键是看你的使用场景 |
![]() | 40 lonelygo 2020-11-12 10:02:57 +08:00 并不能,17 对于大多数生产项目来说“已经够新了”。 祖传代码 11 的还有很多。 所以,11 开始吧 |
41 lonewolfakela 2020-11-12 10:51:51 +08:00 @neoblackcap 按照 https://en.cppreference.com/w/cpp/compiler_support 这里给出的信息,gcc 、clang 、msvc 三家里,clang 的进度是最慢的一个…… |
![]() | 42 shfanzie 2020-11-12 10:53:26 +08:00 从 11 开始学 |
43 neoblackcap 2020-11-12 11:28:03 +08:00 @lonewolfakela 我感觉里面的缺的特性更像 clang 不会去实现了 |
44 lzhCoooder 2020-11-13 11:52:49 +08:00 c++11 都成祖传代码了.... 看你需求了我有些.cc .cpp 直接改名.c 都能编译,我觉得 c++11 和 c99 已经足够了 |