为什么拥有C语言基础的人,依然学不会C++_-microcai
当你认为 C++ 是面向对象的语言的时候,你就永远学不会 C++。
恰恰大部分学了 C 的人,都会认为 C++ 不过是 C 上加了“对象”。既然是 C with class, 他自然就很自信的认为自己很快就能学会C++。
C++ 不过尔尔。
-—
但是,当他有一天,需要使用C的时候,很快他就会感到巨大的挫败感。
因为C除了 C with Class ,剩下的东西他没一个能懂的。
C++ 真的是太复杂啦!
这就是大部分人 C++ 从入门到放弃的原因。
如果放弃自以为是的面向对象的成见,好好的学习 C++,就会发现, C++其实是个面向“概念”编程的语言。
C++ 的一切特性,都是为了 0 开销抽象 “概念”。
为何会有模板?
因为,同一个概念,用同一份代码。而不管这个概念背后的真实数据类型。比如 std::sort, 他就是排序。只要能比较大小的,就能排序。你管他是 int 还是 char 还是float, 甚至连 string 都能排序。只要能满足 “可比较大小” 这个概念的,都要能排序。
既然排序,就得有容器。排序排序,得有个容器,把东西放里面排排放,那才有顺序的概念。
于是就有了 “容器” 的概念。为了操作容器,就要对容器进行更高程度的抽象,于是就有了 “迭代器”的概念。迭代器,就是用来访问容器里存储的对象的。是容器的抓手。
有了容器,就有了“对象”生命期的管理需求。对象放入容器,拿出容器,它到底何去何从。
于是就有了右值引用和左值引用的概念,这样就能设计出 拷贝构造和移动构造。
有了拷贝和移动的概念,才能设计出性能更好的容器。对象是被移动到容器里的,而不是拷贝进去的。这就大大降低了使用容器存储“大对象”的开销。
这些都有了,又发现,如果用错了对象,对象和模板希望的“概念”不匹配,编译出错就会非常疯狂。
于是就有了 “concept” 关键字。加上了模板参数约束功能。
很多时候,一个通用概念下,总会有一些“特例”。为这些特例按排单独的代码,不共享通用的模板代码,就可以更好的“优化”性能。于是就有了 “模板特化” 功能。
模板特化,是为了更好的实现概念。比如 容器一般会对 普通的“对象” 和 简单的内置类型对象,使用不同的代码。因为内置类型没有“构造函数”。于是,容器的模板,就会对简单类型进行特化。这样的特化代码,对无构造函数,无析构函数的对象,进行针对性的优化。
但是,无构造函数的,难道只是内置类型吗? 用户写的对象,也可以无构造函数。于是,这种模板特化,就不是为具体类型进行特化,而是对某个细分的“概念”进行 一半的特化。这种一半的特化,就叫 模板偏特化。 也是为了更好的实现 面向概念编程。
所以你看,一切 学不会的 C++ 特性,都是因为他还在使用“面向对象”这种思维方式。
评论区
木三拍: 确认过眼神,是写模板上瘾的人[酷] 👍🏽203 💭上海 🕐2024-11-09 04:41:11
│ └── 苏公子: 模板 是c++ 的灵魂 👍🏽18 💭山东 🕐2024-11-12 11:16:03
│ │ └── 木三拍: [捂脸][捂脸][捂脸][捂脸][捂脸] 👍🏽0 💭上海 🕐2024-11-12 12:33:43
│ │ └── 黑风寨大债主: 笑了,敢情c开始都没有灵魂,这都是什么说法 👍🏽1 💭山东 🕐2024-11-12 22:20:46
│ │ │ └── 苏公子: c with class 呗? 👍🏽0 💭山东 🕐2024-11-13 09:30:11
│ │ │ │ └── 黑风寨大债主: 怎么,class没有灵魂,宏是不是就有灵魂? 👍🏽0 💭山东 🕐2024-11-13 10:55:35
│ │ │ │ └── 苏公子: 楼主的文章白读了 👍🏽0 💭山东 🕐2024-11-13 11:14:08
│ │ │ │ └── 黑风寨大债主: 他写的的就有问题,我并不认可 👍🏽5 💭山东 🕐2024-11-13 11:51:17
│ │ │ │ └── 苏公子: c with class 一样能干很多活,实际上,研究过MFC 和 QT的源码,人家也都没用什么高深的语法,都是平平无奇的语法写的很精炼 👍🏽4 💭山东 🕐2024-11-14 09:47:51
│ │ │ └── Hang Zhao: 所有码都没有灵魂 👍🏽1 💭新西兰 🕐2024-12-22 07:23:10
│ │ │ └── 大哥: c开始没有灵魂很可笑吗[好奇]你好像理所当然的认为一件事物一出现就必须有灵魂,可是难道你没听说过“给XXX注入灵魂”这种说法吗,你没听说过画龙点睛的故事吗[好奇]一件事物开始被创造出来的时候没有灵魂,后来才被注入灵魂,在我看来是十分正常的一件事,不知道你为什么笑了 👍🏽0 💭辽宁 🕐2025-04-28 01:01:09
│ │ │ └── 黑风寨大债主: 不但笑了,而且是大笑。你所谓模板是灵魂,画龙点睛的依据何在?c自出现以来,历经40多年发展,工业级代码不计其数,不用模板的多了去了。我敢说,百分之99的项目,只用经典的c也完全可以实现,c的灵魂就是实现了封装,继承,多态的经典面向对象的理论,这是它的立身之本,而不是什么模板。编程适当使用模板有助于提高效率,比如Stl库,但现在的模板元编程已经不是正常的发展路径,是魔法,除了炫技之外没有什么价值,静态编译期实现功能不是它的初衷。我用了很多很多年的c和c,模板只用最基础的功能,库基本只用stl,boost也只是挑选的用,合适够用就好,至于说是灵魂,算了吧。 👍🏽2 💭山东 🕐2025-04-28 09:50:02
│ │ └── 大福: 我们这边搞 cpp 数 值计算的就只会用基于对象和容器,什么模板,就只会用[捂脸][捂脸][捂脸] 👍🏽2 💭四川 🕐2024-12-21 08:36:28
│ └── 苏公子: c with class 一样能干很多活,实际上,研究过MFC 和 QT的源码,人家也都没用什么高深的语法,都是平平无奇的语法写的很精炼 👍🏽3 💭山东 🕐2024-11-14 09:48:38
│ │ └── 黑风寨大债主: 对啊,所以你所谓的模板是灵魂,理由是什么 👍🏽1 💭山东 🕐2024-11-14 17:58:08
│ │ └── 苏公子: 大宗师: “ C是个面向“概念”编程的语言。C 的一切特性,都是为了 0 开销抽象 “概念”。” c with class 你用的再好,也最多也就是个九品,永远达不到大宗师的境界! 👍🏽1 💭山东 🕐2024-11-15 17:46:51
│ │ │ └── 黑风寨大债主: 笑了,还大宗师,人人都是大宗师,人云亦云。 👍🏽1 💭山东 🕐2024-11-15 18:00:50
│ │ └── 职业推送: 写 C++ 很容易写出模板来。一段相同的程序如果在多处使用,一般写一个函数到处调用。如果算法(或代码)基本相同,唯一的区别就是数据类型,这时你就会自然的使用模板写了[捂嘴][doge]我的 Qt 项目几乎都有模板,模板可以少写很多代码[捂嘴] 👍🏽1 💭广东 🕐2024-12-18 12:18:50
│ │ └── 黑风寨大债主: 并不否认模板的好处,这也是stl能大行其道的基础。但说是什么灵魂远远算不上。而且过度使用元模板编程,那就是歧路了。 👍🏽3 💭山东 🕐2024-12-18 12:56:08
│ │ └── 苏公子: 全都是模版导致程序逻辑最后没法看了。模版适当使用,用到点睛的地方 👍🏽2 💭山东 🕐2024-12-21 10:11:00
│ └── IT落幕参与者: 咋不讲元编程呢 👍🏽0 💭湖北 🕐2024-12-19 23:58:11
│ └── Hang Zhao: 0帧起手,编译器给20个warning先热热身🤣 👍🏽2 💭新西兰 🕐2024-12-22 07:22:34
│ └── 马克杯: 普通的软件开发,需要自己写模板的地方真不多。我的观点是c++中,面向对象(OOP)是核心,模板是在基础上更进一步的抽象。 👍🏽2 💭湖北 🕐2025-02-02 19:29:54
│ └── 依依那朴: 学c的要是不能偏执于强强强类型,他就不好理解cpp。至于面向对象,理解模块划分就行了。 👍🏽1 💭湖北 🕐2025-05-17 22:11:14
臭卖鱼的: 只需要c with class,就能干99%的事了。 👍🏽90 💭上海 🕐2024-11-09 07:15:01
│ └── 赵枫: 是能干很多事,但是看有些人写的代码根据看不懂。 👍🏽31 💭河南 🕐2024-11-09 20:43:55
│ │ └── 何所言: 确实,还是要了解一下新特性的 👍🏽0 💭山东 🕐2024-11-11 18:23:57
│ │ └── falylee: 我就说了,错字很容易暴露输入法[大笑] 👍🏽3 💭河南 🕐2024-11-12 07:19:41
│ └── 苏公子: 是 学会C++的1%就能干99%的事情了 👍🏽1 💭山东 🕐2024-11-12 11:14:55
│ └── 小鹏飞: 100%,你告诉我啥不能干?不知道搞一大堆语法出来是为了什么? 👍🏽2 💭上海 🕐2024-11-12 14:06:20
│ │ └── Zero: 其实你只学C,也是能干100%的事情了,关键是效率的问题,比如说你要写一个数学库,用C也是能实现矩阵乘法,但写起来非常低效且丑陋,模板加上符号重载就能很好的解决这个问题。还有cpp20的新内容,也都是为了更好的做某些事情而加入的,比如说sfinae就能大幅度降低你编写的代码量,并不是没有sfinae就做不了什么事情 👍🏽1 💭广东 🕐2024-12-04 14:51:34
│ │ └── 职业推送: 有模板可以少打字,相当于有函数一样,也可以少打字[doge] 👍🏽0 💭广东 🕐2024-12-18 12:20:35
│ └── 失而复得: 没入门 👍🏽0 💭四川 🕐2024-11-12 22:18:18
宇宙区长孙连成: 只会C with class和会用stl基本能干 99%的工作了[飙泪笑] 👍🏽47 💭上海 🕐2024-11-09 21:54:33
│ └── 黑风寨大债主: 我相信是99.99% 👍🏽9 💭山东 🕐2024-11-12 22:14:31
│ │ └── 大福: 个别方向是 100%。而且会基于对象编程就 ok,什么面向对象根本没用过 👍🏽0 💭四川 🕐2024-12-21 08:37:57
│ │ └── information: 我就是C+模板,还有C的结构体和C结构体是C结构体可以面向对象,且兼容C[捂脸]但是我这种写法遭到很多群的唾弃[捂脸] 👍🏽0 💭广东 🕐2025-06-12 08:23:55
│ │ └── 大福: 拿到工资就行啊还有什么自行车[捂脸][捂脸][捂脸] 👍🏽0 💭四川 🕐2025-06-12 13:10:39
│ └── 臭卖鱼的: 我的c++也就这个水平 👍🏽1 💭上海 🕐2025-05-15 09:05:31
哈哈: 说的有道理,假定你是真的融汇贯通了才说出的这些,我也假定我c语言也用的很好了。老手认为总结的不错,但总觉得新手如果上学就学这些很容易忙活在各种概念、各种实现手段里。我用c的时候基本上可以看做面相内存的编程:长期保有的变量放堆区,堆区变量的管理用结构体嵌套,每层结构体配合响应的函数,以模仿c的类、构造函数、析构函数、成员函数,用起来相当于c的new对象;函数内临时变量采用栈区变量。传参时如果用到栈区里变量始终传地址,类似传对象的this指针或者对象的引用,优点是内存使用率极高,同一的数据对象是存在一处,里面放个环形队列配合信号量还能用来异步通信。我用c++最大的别扭是权限保护、静态蔓延,继承我还发挥不出他的价值,多态也就那样吧,虚函数调bug时很费劲。至于模板,数据结构像链表、环形队列、栈结构都手搓,目前层次不够吧,还没怎么用过树结构。目前也就够用了。 👍🏽28 💭山东 🕐2024-11-09 08:44:48
│ └── 不爱烧烤: 你这顶多是语法层次的,模板用c来实现大多依赖宏,跟你说的完全没关系 👍🏽9 💭江苏 🕐2024-11-11 20:38:37
│ └── sedsed: 有用 👍🏽0 💭广东 🕐2024-11-11 23:24:41
章三: 各位凭心而论,把一个理科及格且逻辑正常的高中生培养到能够灵活处理你们公司卖的最好或者自称为最复杂的系统,需要几年?高校并不是培育行业人才的,是解决教师及行政人员就业的场所,是缓解学生就业压力的场所。讨论编程语言的差异有价值吗?各位工科的大佬,各位工程学的老少爷们,社会更关注的是make it work. 👍🏽24 💭湖北 🕐2024-11-10 07:14:29
│ └── hai1039: 从市场人员或者管理层的角度,不管你用啥语言啥模式实现,只要能忽悠客户付钱就是好的。[大笑] 👍🏽15 💭印度尼西亚 🕐2024-11-10 16:38:22
│ └── 顾清: 私以为正是如此,才是如今高校职能的缺失。高校作为一个社会事业单位,为国家为社会承担输送人才,承担作为国家高精端科研的职能。但是现在企业反过来需要承担一部分培养人才的责任,更能说明问题所在。所以我个人觉得大学制度早就需要革新了,作为已经诞生了几百年的制度,已经有些不适应当今社会经济发展的趋势了。 👍🏽9 💭湖北 🕐2024-11-10 17:49:42
│ └── HEATH: 是这样的,你得理解早年间宣传的“教育要理论与实践结合”早就名存实亡了 👍🏽1 💭湖北 🕐2024-12-19 16:27:20
│ └── 章三: 啥代码要六七年?还不能上手?你这也太浮夸了,六七年都够干出好些套新的了…不过没人带确实,大家都是各凭本事自己摸索。但我的感觉这个时间绝对比大学四年要短很多。单就上工干活,我觉得大学四年是绰绰有余的浪费。软件行业,对于新人能给出的转折最多半年到一年。偏业务系统时间会长一点,偏技术系统则更短。两三年都得成为干活的骨干,如果干不了强留,会很痛苦,自然就走了。当然我指的多数是目前的各类行业应用软件,如果是类似操作系统,浏览器,数据库等基础设施,我没有机会参与,可能差异会很大。 👍🏽2 💭湖北 🕐2025-01-11 08:14:34
│ └── 卖炸弹的疯子: 你说的操作系统、浏览器、数据库可能没有那么难搞,难搞的是一些专业类的算法,比如传统通信,这东西需要你一行一行写,没有像人工智能的算法库可以调,你需要阅读大量的相应的英文行业协议标准和扎实的数学基础,这种数学不是你大学学的那种高数线代概率等简单的数学。你数学英文不好真搞不定 👍🏽1 💭北京 🕐2025-03-27 14:18:47
│ └── 章三: “人工智能的算法库”是个什么东西?人工智能有算法库吗?人工智能啥时候不以算力而以以算法见长了? 👍🏽1 💭湖北 🕐2025-03-27 14:43:23
│ └── 卖炸弹的疯子: 可能我没说清楚 👍🏽0 💭北京 🕐2025-03-28 12:58:25
阿剑客: 我去感觉说的很有道理,但是我是菜鸡。 👍🏽18 💭四川 🕐2024-11-08 22:15:53
│ └── 阿剑客: 答主可以多说一点好吗[微笑] 👍🏽0 💭四川 🕐2024-11-08 22:16:23
│ └── fish: +10086 👍🏽0 💭广东 🕐2024-11-09 01:39:58
北巷凉风: 想学C++,任何C++的书,只用看前50%就行了,后50%在我看来就是无病呻吟,为了出规范而出的规范。花里胡哨的东西太多太多了 👍🏽12 💭江苏 🕐2024-11-10 01:18:15
Allen: 面向抽象[doge] 👍🏽10 💭广东 🕐2024-11-09 09:57:25
神父: 学语言有先入为主的一个思想 我开始java后来go 现在拿go当java用 mvc分层 对象[酷] 👍🏽8 💭山东 🕐2024-11-09 09:27:39
│ └── 希留耶: go本身就是那帮人觉得java挺不错,又继续搞出来的东西 👍🏽3 💭山东 🕐2025-01-21 17:27:13
噤若寒蝉: 希望答主多说点 意犹未尽[惊喜] 👍🏽8 💭北京 🕐2024-11-09 08:34:25
吉姆特鲁伊: 别讲了别讲了[大哭][大哭][大哭] 👍🏽4 💭辽宁 🕐2024-11-12 01:27:20
joe: 说一点不同观点(仅仅是个人对C的看法,无意争吵, 给愿意看的人看两眼。)我03年上的C语言课, 当时就介绍了模板, 图书馆中也能看到 stl 相关书籍, 微软也有个ATL库, 但是彼时模板并没那么重要。 如果做windows开发, 可能学学COM相关的东西,反而更为实用。我在刚上班的前几年, 抱着学习的目的,特意写了几个模板类, 但是我发现模板类不能隐藏实现代码, 我不想把我辛苦写的代码免费暴露给别人, 对的, 我不是开源代码支持者, 但是如果我使用任何开源代码,我会遵守相关协议。 这方面我应该比 不遵守协议的开源人 要道德。扯的有点多, 让我放弃模板的原因就是 模板类 代码不能隐藏。 另外还有一个原因是 调试模板代码 比较困难。另外就是, 我发现哪怕是重载函数, 我重复写几个重载函数也并不辛苦。 实际项目中的重载函数并不多,那么模板还有意义吗? 毕竟模板引入的,就是为了少写重载函数。中间几年过去, 我一直没有使用过stl,自己也没写过模板类,模板函数。很快,C11开始流行, 头几年我也没有在意。 但是随着它的流行, 迫于打工要求, 不得不去了解一下。我是抱着怀疑的态度去学习的,但并不是抵制, 尽量让自己中立, 如果确实好, 我愿意接受。 如果它足够好, 我甚至愿意放弃原先积累的代码,重新学习新知识,新技巧。C的每个新特性, 我都尝试列出其优点, 不足, 然后权衡比较。 很遗憾,所有特性,我都不愿意采纳。 我认为C11之后,围绕着stl转,就是一条歪路,邪路。当然, 我是从C, C + class, stl 这个路径过来的。对于现在 直接从stl开始学习的人来说,可能感受是不同的。 我使用C+class 似乎没有做不了的事, 可能偶尔会使用一些stl的某些类, 比如原子变量,但也仅此而已。 对我来说,再花时间去学stl是非常不值得的事情,没有收益。就好比,我立志要做一个作家, 我要写小说, 现在我费尽千辛万苦学会了英语, 然后有人说 法语更优美, 那我再花5年时间去学法语, 不写小说了? 5年以后再学另一个语言? 那什么时候写小说呢? 如果学习法语能赚很多钱,也许还可以试试,但是现在写代码这活,工资并不高, 根本不值得花那么多时间去折腾。stl的代码,我多少也看过一点(右键goto define), 说实话, stl的代码太复杂了, 并非看不懂,但想看懂也真是不容易,因为它一层套一层,层层都有classtype。 学习成本肯定是高的。并且,任何一个工科学生应该都明白: 越复杂的系统越容易出错, 出错了,越不容易解决。 你说你不这么想, 那也别和我争,我也不和你争。总之, 我觉得stl是复杂, 因此,它并不是一个好的工程产品。再说, 很多人都讲C难学,说C++代码难看懂。可能还会有一点炫耀的心态。 如果你真觉得难, 那赶紧放弃吧, 这么难的东西, 它真不适合作为大众开发语言, 也很难找到合作伙伴。我们写代码的目标,应该是让其他人非常容易地看懂, 尽量少学习(复杂的)规则。 👍🏽4 💭北京 🕐2024-11-11 06:19:16
│ └── microcai: 你觉得模板没有意义,那时因为你写 C 的时候也不写宏。你看不懂 stl 的代码,那是因为 stl 的代码确实就不是给人看的。stl 只考虑到了易用和性能,而没有考虑到易读。这其实是当年c缺乏更好的语法糖导致的。比如迭代器 ,为啥会写一堆没用的代码,其实就是为了做类型约束。有了 c20 的 concept 其实可以完全重写迭代器,大幅提升代码可读性。只不过,只有把容器一般用用的代码才不受影响了。那些深入 迭代器的内部实现 而对自己代码做了定制的 那部分代码就遭殃了。对于这种会破坏兼容性的改进,stl 一般就没动力改了。反正stl代码难读难的是写编译器的人。当然你其实还是走了一个弯路,就是非要学stl. 你所谓的学stl, 是指完全搞懂 stl 的内部实现。其实是没有任何必要的。 stl 作为和编译器配套的源码,本身并不100%是使用c标准语言写的。里面会利用一些特定编译器的语法扩展。想搞懂stl内部实现,是十分困难的。即便对编译器作者来说都有相当的难度。有一部分stl的实现,是利用编译器的语法扩展实现更高性能,或者说 0 抽象开销。而也有一部分stl的实现,脱离编译器扩展是完全无法实现的。stl如果只是使用,那是0学习成本的。根本不用学。所谓学不懂stl, 其实是放不下“一定要看懂stl的内部实现才愿意用它” 这种心智负担。你觉得 stl 过于复杂,其实是阅读工程质量的stl得出的结论。如果你看的是玩具stl, 那你会发现, stl 的任何一种容器,代码量绝对不会超过200行就能实现。只要你完全不在乎性能。事实上,很多人不用 stl ,但是就是会把自己用到的工具自己“手搓”一个轮子出来。实际使用性能和 stl 相差无几。因为 stl 那复杂的代码,它主要考虑的是“任意情况下都要 0 抽象开销”。 而恰好,在自己的工程里,其实即便使用 stl , 代码路径其实也是走的那条最通用的模板。而去掉了那些为特例准备的代码,自然代码量大幅缩小。为了优化特例要写额外的代码,这恰恰是因为 c 语言不够复杂,语法糖不够多导致的。 👍🏽7 💭浙江 🕐2024-11-11 09:11:46
│ │ └── joe: 你第一句 猜想就错了, 我的代码里, 宏用的很多。我甚至用宏实现了几种线性表。 👍🏽0 💭北京 🕐2024-11-12 03:56:12
│ │ └── joe: 另外, stl的代码,你都看不懂, 那你敢用?(谁也别吹牛,说stl的代码易读) 👍🏽0 💭北京 🕐2024-11-12 03:57:31
│ │ └── 知乎用户HIaHHO: 做工程的基础就是信任啊,如果你每一行代码都要搞懂那没法写代码了。你要调用系统API是不是要弄清楚系统的实现,是不是还要清楚CPU每一个门电路是怎么设计的。如果你写了一堆宏还觉得那玩意比模板好懂好调试那确实牛 👍🏽3 💭上海 🕐2024-11-12 09:21:57
│ │ │ └── joe: 信任就是不知其所以然吗?另外, stl 连一个好用的字符串类, 都提供不了,凭什么信任它?宏可以分行写, 那你调试的时候,就可以逐行跟进。另外,宏是非常好的工具, 并且 也是不可替代的。 👍🏽0 💭北京 🕐2024-11-12 12:25:15
│ │ │ └── 知乎用户HIaHHO: 微软文档有讲它内部怎么实现吗,你也敢调用系统API?MSVC标准库没有文档吗?信不信任STL和它提供的字符串接口丰不丰富有什么关系?宏在某些情况下不可替代是因为语言设施不够完善,但这不是它优于模板的理由 👍🏽3 💭上海 🕐2024-11-12 12:55:04
│ │ └── microcai: 你也没见过 windows 的源码,居然敢调用 windows api [惊讶] 👍🏽2 💭浙江 🕐2024-11-12 09:59:17
│ │ └── joe: 你随意(微软的代码没开源, 有详细的文档) 👍🏽0 💭北京 🕐2024-11-12 12:20:45
│ └── Seide: c的问题在于,大多数人认为是c语言的升级版,其实不是。c是面相过程编程。而c是面相对象编程,又加上了面相模板的编程(面相数据结构的编程),即有指针又加上了pascal的引用语法。所以对初学者就很乱,关键字和运算符也不友好。不过一旦理解了面向对象和stl的思路,c就自然而然会用了。 👍🏽0 💭江苏 🕐2025-03-28 01:30:20
│ └── joe: C 语言也可以面向对象编程,当然用起来稍微麻烦一些。C 就是C的超集, 起初C就是C的升级版, 名字叫C也是这个原因。当然,随着发展, 使用模板,stl编程, 可以认为是一个全新的语言, 与C没什么关系了。关于模板,我的观点可能比较小众。 我觉得在cpp中, 模板被滥用了。 👍🏽0 💭北京 🕐2025-03-28 02:50:45
│ └── 小王: 发展到今天,模板才是C的本体。不用模板的C实际上没有存在的必要,换个别的语言也能写,可能还更容易一些。模板才是C++的核心竞争力所在。 👍🏽1 💭中国香港 🕐2025-06-04 22:21:33
田小丁: 啊,头好痒,感觉要长脑子了 👍🏽5 💭浙江 🕐2024-11-09 16:21:26
黑风寨大债主: 不同意,经典c++加一个stl就很好,模板适当使用还是有价值的,但后来的模板编程已经走火入魔,沦为魔法语言。 👍🏽4 💭山东 🕐2024-11-12 22:11:26
│ └── Hang Zhao: 招聘广告都只要10年经验起的大魔导士🤣 👍🏽1 💭新西兰 🕐2024-12-22 07:24:22
风吹沙草: AI时代,编程语言越来越不重要,喜欢哪个用哪个,不用花太多时间在这上面。 👍🏽2 💭广东 🕐2024-11-11 16:27:01
hotas: 看是不是真的需要了。用C编程的环境,很多是不需要使用C的那些特性的,为了用C而用C++,当然会很别扭。当到了必须用C++的时候,那些特性才是自然而然被用上的,学起来就容易多了。教员教导我们“不是先学好了再干,而是干起来再学习,干就是学习” 👍🏽2 💭北京 🕐2024-12-20 14:19:24
天伐炼狱: auto 👍🏽1 💭上海 🕐2024-11-20 23:31:25
很想奔跑: 代码量太少就不会理解c的设计,标准库看的太少就不会理解这帮搞c的人都是搞数学出身的。业务上就写不到10w行代码的工程,理解不了什么架构设计和高可用性的内涵。工程团队少于20人的队伍搞不明白什么是cicd。如果你有不同的看法,那对不起我都是瞎说的。 👍🏽2 💭广东 🕐2025-05-14 02:23:46
无敌小羊毛: 这语言那语言,不如学好数学。轮子拿来就用,车子上手就开,谁管咋来的。 👍🏽2 💭浙江 🕐2024-12-18 16:10:38
只回一次: 我第一次用c++写一个图书馆管理系统,按老师要求把那些模板、重载之类的特性包含进去写了一个月。如果不考虑那些东西不用一个星期就可以了。 👍🏽1 💭福建 🕐2024-12-09 17:54:23
Zero: 其实会C就能干几乎cpp能干的所有事情了,但用C写个数学库,没有模板没有运算符重载,这不是蛋疼至极?所以,学cpp的新特性,不是为了能干某事,而是为了能更好更轻松的干某事,比如说模板sfinae就能大幅度的降低代码量,工作效率一下子提高了好多 👍🏽1 💭广东 🕐2024-12-04 14:56:06
花样年华: 我曾经就有个同事,他认为他也会C++,但是他认为类就是个工具和函数一样,所以他会把所有逻辑都写到main里面,其余函数就放类里面。 👍🏽1 💭北京 🕐2024-11-12 09:53:36
Kevin: 第一性原理[doge] 👍🏽1 💭浙江 🕐2024-11-12 07:31:01
faint faint: 先学R再学python的人应该学不了这些[吃瓜] 👍🏽1 💭湖北 🕐2024-11-12 11:37:15
myyy: C转C++,先把.c换成.cpp 👍🏽1 💭辽宁 🕐2024-11-11 08:16:57
全桥整流器: cpp可以没有面向对象,但不能没有模板,实际上cpp里的任何概念应该都比面向对象重要 👍🏽1 💭上海 🕐2024-11-09 09:21:47
│ └── 桃花侠: 这恰恰说明你还没有理解面向对象的核心应用在哪里 没有理解为什么要面向对象 👍🏽2 💭浙江 🕐2024-11-09 09:44:45
│ │ └── 哼哼哈黑: 面向对象固然是经典,但后入对象才够爽 👍🏽0 💭江苏 🕐2024-11-09 14:31:12
│ │ │ └── iams13: 我管你这那的,反正CPP有两个P,哪个好用就用哪个。 👍🏽0 💭浙江 🕐2024-11-09 16:12:48
│ │ └── 全桥整流器: 才疏学浅,请赐教 👍🏽0 💭上海 🕐2024-11-09 15:08:42
│ │ └── 桃花侠: 赐教不敢,这和业务面和应用场景有关系,三言两语说不清楚。你的业务可能不太需要,但起码我的日常业务来说,如果C不能面向对象,那我的工作没办法做了。 👍🏽0 💭浙江 🕐2024-11-09 22:16:57
│ │ └── 一个普通人: 现在说这些已经没有意义了,你当然可以说C可以没有面向对象,因为面向对象最适合做的项目现在全用Java写了。2010年以前,C霸榜那会,模板没什么人写,面向对象却是必不可少 👍🏽0 💭上海 🕐2024-11-15 06:14:27
│ └── 黑风寨大债主: 没有面向对象,还叫什么c,class的定义是干什么用的,继承,抽象出纯虚函数虚函数的目的是什么。c早期的时候,哪来什么模板。 👍🏽3 💭山东 🕐2024-11-12 22:18:52
│ └── BinaryGuy: 虚函数这么一个烂到爆的特性就别拿出来说了 👍🏽0 💭北京 🕐2025-06-21 19:17:14
│ └── 黑风寨大债主: 烂到爆?动态的多态就是真多态。比什么静态期确定的强多了,什么模板编程,异端而已。 👍🏽0 💭山东 🕐2025-06-21 19:50:11
│ └── BinaryGuy: https://www.zhihu.com/question/1149593088/answer/9081993522?share_code=GHZ0e8dSVoxZ&utm_psn=1919862179965965194 虚函数是非常费性能的“抽象” 👍🏽0 💭北京 🕐2025-06-21 21:00:36
│ │ └── 黑风寨大债主: 还费性能,一个虚表实现能费多少性能,应用层又需要多少性能。百分之99的性能问题不会出在语言层面。 👍🏽0 💭山东 🕐2025-06-21 21:20:53
│ └── BinaryGuy: 绝大多数人写出来的虚函数可以用CRTP代替,性能完全不在一个水平 👍🏽0 💭北京 🕐2025-06-21 21:01:41
│ │ └── 黑风寨大债主: 虚函数能有几个,成千上万吗,那是应用层设计问题,不是语言问题。如果虚表妨碍了性能,只能说应用层的设计实在不堪入目。 👍🏽0 💭山东 🕐2025-06-21 21:22:34
│ │ └── BinaryGuy: 你见过虚函数调用代码编译后的汇编吗[飙泪笑],你看完还这么喜欢虚函数只能说从来没有面对过性能intense的业务场景 👍🏽0 💭北京 🕐2025-06-21 23:03:27
│ │ │ └── 黑风寨大债主: 我没见过需要优化虚函数的场景,也相信绝大多数人用不到,不要用极端个例来代表全体,一叶障目不见泰山。极端的性能追求,直接用汇编好了,还反编译看什么。手搓一个性能最佳的,不才能体现自己对性能的卓越追求? 👍🏽0 💭山东 🕐2025-06-22 06:48:00
│ │ │ └── BinaryGuy: 我没见过=没有,我用不上=大多数人用不上[飙泪笑]这么性能不敏感那为啥写C呢,写个go不好吗 👍🏽0 💭北京 🕐2025-06-22 11:09:57
│ │ └── BinaryGuy: [惊喜]拿个Vtune或者uprof上你的程序看看 跑到虚函数那一段流水线空泡的读数有惊喜 👍🏽0 💭北京 🕐2025-06-21 23:05:49
│ │ └── 黑风寨大债主: 那又怎样,应用层消耗的资源是这个的千杯百倍,优化性能,不优化应用先优化虚表,滑天下之大稽,但凡有点实际应用经验的就不会说这话,就是做高频交易,人家也是优化网络,并发资源层。为了区区几个虚表项,没有必要。为了炫技的技术,本身就没有什么生命力。 👍🏽0 💭山东 🕐2025-06-22 06:54:00
│ │ └── BinaryGuy: 优化io和优化cpu是一回事吗,看出来你真的没做过这种业务开发了,没有必要说了 👍🏽0 💭北京 🕐2025-06-22 11:07:24
│ └── BinaryGuy: 剩下的std variant基本上能cover 👍🏽0 💭北京 🕐2025-06-21 21:04:24
自由乱余生: 开课吧哥[飙泪笑] 👍🏽0 💭天津 🕐2024-11-09 14:23:01
七夜: 很清楚的讲解 👍🏽0 💭河南 🕐2025-05-13 19:37:41
长阳山人: 因为没对象,用结构体对付[捂脸] 👍🏽0 💭北京 🕐2024-11-11 17:09:21
随它去吧: 菜鸡看不懂 👍🏽0 💭安徽 🕐2025-06-18 08:40:47
伍格: 这种方式去做工程,会是灾难 👍🏽0 💭山东 🕐2025-06-12 08:34:10
网络狼民: 开发思想不一样 👍🏽0 💭黑龙江 🕐2025-06-06 11:06:04
Bill Han: 文章开头就是说的我本人。我到现在对面向对象的编程都感到痛苦。我是80年代末自学C,当时都是面向过程的编程。 👍🏽0 💭浙江 🕐2025-06-05 17:04:52
Samaritan: 楼主总结的很不错👍👍👍 👍🏽0 💭广东 🕐2024-11-09 08:25:50
guy odd: 虽然迷信权威不对,但是Effective c早有经典论断:C本质上是4门语言塞到一个壳子里而且到今天搞不好还不止4门 👍🏽0 💭英国 🕐2025-05-31 07:09:12
刘生: 现在的c++好麻烦, 要写个类, 还啥都没干呢, 先写构造函数, 析构函数, 拷贝构造,传递构造, 拷贝赋值, 传递赋值。 上来就写一坨。 不过今年有AI了, AI可以给写好。 👍🏽0 💭北京 🕐2025-05-30 17:00:18
老南: 我59岁,从20多岁,TC1.5。历经BC,VC,到现在VC2022,凡37年。面向对象,只是偷懒的写法,没有任何益处。模板,除了难以排错,反人类。 👍🏽0 💭北京 🕐2025-05-30 20:46:32
海阔天空: 并不是零开销抽象,如果你用了virtual和shared_ptr… 👍🏽0 💭英国 🕐2025-05-24 02:40:19
萝卜列夫耶维奇: 0开销抽象 👍🏽0 💭云南 🕐2025-05-20 18:02:21
Fridayq: “C++ 的一切特性,都是为了 0 开销抽象 “概念”。”这句话写得很棒,很有高度视野的话,一切工具的创造都是为了以最通用的形式达成目的 👍🏽0 💭广东 🕐2025-05-18 03:56:37
飞墨羽: 你说的这个是面向类型的开发,属于设计模式里面其中一种范式“模版” 👍🏽0 💭北京 🕐2025-05-16 19:54:18
长腿叔叔: 学会了能咋样?35能躲过去嘛? 👍🏽0 💭浙江 🕐2025-05-14 15:49:55
超脱: 总感觉,就是把同一个本质的东西,起了很多名字,多了很多层定义和跳转。然后就会显得很高端 👍🏽0 💭上海 🕐2025-06-25 19:07:46
夜的影子: 看不懂,但很有趣。 👍🏽0 💭河南 🕐2025-05-13 09:52:23
轻思科技: [doge]C with class那叫objective C 👍🏽0 💭广东 🕐2025-05-13 06:16:15
柠檬仙人: ??[思考] 👍🏽0 💭广东 🕐2025-05-07 20:03:01
哈喽: c++的模板+宏太鬼畜了,有时候自己看半天大佬写的代码,最后只能感慨一句,艹,这就是我与大佬的区别 👍🏽0 💭陕西 🕐2025-04-26 19:53:11
李世先: 说的不错,所以如果对效率没有极致要求时,这些都可以不用。用编译器自动的优化就已经很够用了。[doge] 👍🏽0 💭北京 🕐2025-04-25 13:24:06
过客: 有了左值引用和右值引用后,对于模版的参数以及在模版中调用函数继续传递此参数引入的类型确认和类型改变问题,引入了引用折叠和完美转发,为了抽象能带来统一和开发效率,引入了各种语法补丁,为开发者和编译器都带来了不小的难度。 👍🏽0 💭天津 🕐2025-04-13 07:57:20
Seide: 面相对象+面相数据结构。stl实际上是数据结构的通用化。也可以说给C语言加上了名词、动词、量词和单复数的理念。一旦理解了这些软件设计方法的概念,用c语言一样可以实现。 👍🏽0 💭江苏 🕐2025-03-28 01:35:24
知乎用户HSrgdg: 设计C++语言的人真是天才[大笑] 👍🏽0 💭浙江 🕐2025-02-09 23:24:05
风起云涌: 你的有对象才能学得会 👍🏽0 💭山东 🕐2025-01-25 11:56:24
长風漫舞: 答主真是一语中的啊,后悔怎么没早点看到这个,到现在读研真要写高阶c++了才发现怎么跟自己以为的不一样,半夜两点看到这个简直气死我了[生气][捂脸][捂脸] 👍🏽0 💭上海 🕐2024-12-28 01:36:56
陈唐: 就写c,简洁明了[大笑],cpp能干的都能干 👍🏽0 💭四川 🕐2024-12-09 12:28:09
唐小僧: 再来 👍🏽0 💭江苏 🕐2024-11-09 08:52:50
Hampton: moving语义只是比直接传递指针安全些,没什么值得吹的 👍🏽0 💭上海 🕐2024-11-09 07:20:28
allenAA: 放弃成见并不能让我智商变高[飙泪笑] 👍🏽0 💭陕西 🕐2024-11-09 07:38:52
啊这 行吧: C with class和起手就是模板的感觉写的不是一种语言[doge] 👍🏽0 💭上海 🕐2024-12-07 17:20:05
罪人彼得: 你这么一说让我感觉这就是一个java+js的语言,感觉挺有意思的,有空学习一下 👍🏽0 💭上海 🕐2024-12-05 17:07:36
momo: 算了,我还是用macro在c里写模板(是的,说的就是gobject) 👍🏽0 💭西班牙 🕐2024-12-03 18:12:01
习佑年: [捂脸]纯C的,面了几轮后就不敢说自己会做C++……现在乖乖的去啃红皮书 👍🏽0 💭北京 🕐2024-11-21 13:59:19
hustminrui: 就是编译速度要人命[捂脸] 👍🏽0 💭广东 🕐2024-11-20 09:07:22
│ └── microcai: 编译慢,好过运行慢 👍🏽1 💭浙江 🕐2024-11-20 09:08:54
YelaShady: 也不是吧,c++11之前确实主要是c with class吧 👍🏽0 💭上海 🕐2024-11-14 18:39:27
│ └── microcai: 2025年啦。c++11 都是过时的老古董了。 👍🏽0 💭浙江 🕐2024-12-03 19:15:22
书上蚂蚁: 同意。我维护的一个PLC空调节能项目,因为现场设备虽然类型不一样但操作的模式都差不多,所以在比c“低级”的ST语言中,利用union类型一样可以实现类似c++的对象操作。 👍🏽0 💭广西 🕐2024-11-13 11:13:58
钟xiao: 用C艹复杂的高级特性,在生产项目里不是有性价比的选择,一堆高级工程师当然可以做得更好,但更多的时候项目是几个高级工程师带领一堆初级工程师做出来的 👍🏽0 💭广东 🕐2024-11-13 12:45:35
│ └── microcai: 人都是要长进的。你这是属于看不起别人。觉得别人没有进步空间 👍🏽0 💭浙江 🕐2024-11-18 22:57:15
行货正品: 为什么C++这么难学?因为它天生如此。 👍🏽0 💭天津 🕐2024-11-12 07:19:11
喵喵: 哥,多说点[赞同] 👍🏽0 💭上海 🕐2024-11-12 08:49:07
xxxx: 0基础可以学C++吗?[捂脸][捂脸][捂脸][捂脸][捂脸][捂脸] 👍🏽0 💭四川 🕐2024-11-12 10:14:43
│ └── 火羽FP: 可以,推荐B站黑马c++课程(免费)入门,我就是两年前零基础学的 👍🏽0 💭陕西 🕐2024-11-12 12:07:08
威猛的小老虎: 是的,我就是那种认为C艹是C加上对象的那种人[捂脸] 👍🏽0 💭湖北 🕐2024-11-12 03:40:42
BILLY: C++的模板比C#的泛型功能强大多了,同时学习难度也高得多。不过我希望C#能出一个泛型特化的功能。 👍🏽0 💭甘肃 🕐2024-11-11 23:03:13
秋风瑟瑟: 我是Linux内核的拥趸者,我反对使用C++[吃瓜] 👍🏽0 💭浙江 🕐2025-06-25 15:35:22
何足道: 我看了标题觉得不能理解,看了前面两段发现其实是答主对对象的理解狭隘了!放弃C的人不是因为把C理解成c+class,而是很难理解对象,而是基于c编程和基于C++编程的思维模式差异太大了! 👍🏽0 💭湖北 🕐2024-11-10 12:16:32
幻想时间: 我要当你粉丝 👍🏽0 💭四川 🕐2024-11-09 18:35:39
Esyx: cpp的最大的优势也是它的最大的劣势,对于工程而言,通俗易懂且能稳定运行的方法才是最重要的。 👍🏽0 💭江苏 🕐2024-11-09 10:02:01
快叫我吃饭: 我只用c语法,不用C标准库[doge] 👍🏽0 💭湖北 🕐2024-11-09 17:05:16
│ └── 黑风寨大债主: 不用标准运行时,连链接都过不了。你说的是标准模板库吧 👍🏽0 💭山东 🕐2024-11-12 22:15:35
momo: 你是否理解虚函数的本质就是函数指针 👍🏽0 💭广东 🕐2024-11-09 10:55:55
Hunter1943: 醍醐灌顶 👍🏽0 💭美国 🕐2024-11-09 19:11:03
哥斯拉慕夏: 模板哥?我行业也开了一堆互联网哥,今天喊模板,明天映射,后天lambda,这些我都会写。然后我行业玩class就够了,函数重载除非恶意玩都不需要。请问您提的那堆有个吊用? 👍🏽0 💭广东 🕐2025-06-08 11:59:40
jwang128: 模板是垃圾 👍🏽5 💭福建 🕐2024-11-09 02:29:39
│ └── ailei2004: 模板是更安全的宏定义,比继承一个基类要高效 👍🏽27 💭山东 🕐2024-11-09 04:10:40
│ └── zjiali: 同意,更符合0成本抽象。模板的确需要用好的。 👍🏽5 💭葡萄牙 🕐2024-11-09 06:05:39
│ │ └── ailei2004: 嗯,模板机制很精巧,但带来了复杂性 👍🏽0 💭山东 🕐2024-11-09 11:14:13
│ └── 黑风寨大债主: 都编译期实现了能不高效吗,都是宏也高效。不能只看一个面。 👍🏽1 💭山东 🕐2024-11-12 22:22:36
│ └── 哈哈: 所谓通用模板,也就是能适用不同的情况。既然适用于不同的情况,那就需要为每一种情况做不同的分支,里面就全是if else或者switch,怎么可能比专用的要高效呢?开发效率可能高了,但是运行效率不会高的。 👍🏽0 💭山东 🕐2024-11-15 08:25:12
│ └── Teacher H: 然而模版的分发是编译期的,无论是在重载层面的分发还是在函数内部用if constexpr分发全都是编译期行为,最后生成的代码连分支都没有(即使不开任何优化),如果对“编译期”到底意味着什么没有概念,可以不用强答的[语塞] 👍🏽0 💭江苏 🕐2024-11-18 20:03:28
│ └── 哈哈: 那模板是复杂到包罗万象还是简单的极致抽象。 👍🏽0 💭山东 🕐2024-11-19 08:51:04
│ └── Teacher H: 取决于你想怎么写,直接写一个通用的但在特定场景下低效的模板是可以的,花更多心智成本为不同场景撰写不同的模板也是可以的。 👍🏽0 💭江苏 🕐2024-11-19 09:50:46