作者VVll (J.)
看板Soft_Job
标题Re: [讨论] c++真的很难吗?
时间Fri Apr 22 00:51:55 2016
※ 引述《joeywayi (拉拉拉吃屎啦)》之铭言:
: 如题
: 想请问各位攻城湿
: 因为我自己是学习c++入门的
: 觉得比起java友善很多
: 常常听到说c++很难
: 这个是真的吗?
C跟C++是完全不同的语言(无误
C++是个很大很大的坑(相比JAVA/.NET)
C的圣经 The C Programming Language 很薄一本
看完也懂了八九成,写纯C你不用看太多书
C++公认的圣经 C++ Primer 厚厚一本
看完之後你更不懂了,写C++书看不完
C跟C++最简单的差异包含
1.记忆体管理
//这是C的写法
int *ptr = malloc(sizeof(int)); //配置记忆体
free(ptr);//释放记忆体
//这是C++的写法
int *ptr = new int(100);//配置记忆体
delete a;//释放记忆体
而C++的new 跟delete又会影响 建构式(constructor)跟解构式(destructor)的呼叫
在C/C++中记忆体管理,是很重要的事情,没弄好就会造成记忆体被占用
2. 物件导向(Object-oriented)
把所有方法、函式都模组化,并且有封装、继承、多型、抽象的概念(详细自己研读)
而举例来说goto 是C中一个很强大的功能,
但到了C++反而建议不要用,因为会危害程式的可阅读性
而你要在C中写出类似OO的语法当然也是可以,但就很像闭门造车,自找麻烦
3. 样板(Template)
C++之所以强大的原因之一,自己研究
然後C/C++ 跟JAVA/.NET 相比
1. 记忆体管理
JAVA/.NET 少了delete 跟free这些要自己手动释放记忆体的家伙
取而代之的是Garbage Collection(俗称GC),
让底层自动帮你管理哪些资源不再被利用需要释放
因为是系统底层管理的,所以你也不能知道到底释放了没
你顶多使用GC.Collect() //.net 去通知系统该释放了,但系统到底释放了没 天知道
2. 泛型(template)
你没看错,跟C++的样版名称一样,但偏偏两者不完全相同
MSDN中简单说明了这两者不是一样的东西,C#中的是阉割版(应该可以这样说)
https://msdn.microsoft.com/zh-tw/library/c6cyy67b.aspx
3. 指标(pointer, ptr)
C就俱备的强大利器,把记忆体的利用又细分成实体跟门牌号码(指标)的概念
先学JAVA/.Net的在回去看C/C++ 常常会看不懂 ptr到底在干嘛
因为JAVA/.Net 已经简化了ptr,在里面可能会看到的指标大概就只剩this(物件本体)
以上是小弟工作写了半年C++简单的介绍.Net 跟C++的差异
如果是学习导向的,C++跟.Net都学不会吃亏
如果是工作导向的,就看你要走哪个领域
e.g 走前端html/javascript的话,你就不需要学C/C++了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.240.59.148
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1461257524.A.154.html
1F:→ freeunixer: 是 Java/C# 只能 ref 不能 ptr ,就搞不懂 ptr 在干啥. 04/22 01:10
2F:→ freeunixer: 学 Java/C# 的 ref 以为是 ptr,学过 C++ 才知道并不是 04/22 01:12
3F:推 loveflames: 其实C++用smart ptr比较好,还有C++也加入GC机制了 04/22 01:22
4F:推 doomleika: 没有finally强迫要用RAII不然等着resource leak 04/22 01:38
5F:推 doomleika: 一堆undefined behavior出错又不会告诉你有问题 04/22 01:40
6F:→ doomleika: Double delete把heap搞烂大概一个星期就没了 04/22 01:41
7F:→ doomleika: 编译器对标准不是100%实作有些功能看得到吃不到 04/22 01:42
8F:推 doomleika: 标准函式库在应用面太弱变成要实务些东西又要看 04/22 01:45
9F:→ doomleika: 第三方lib,然後不同lib写法有不一样 04/22 01:45
10F:推 doomleika: 有一堆选择,也不像一堆语言有规定一个写法或conventio 04/22 01:47
11F:→ doomleika: 变成procedure/OO/generic全部都要会 04/22 01:48
12F:→ doomleika: 不能只会一种,不然没办法维护legacy code 04/22 01:49
13F:推 loveflames: C++同样一件事可以用一堆语法来写,还有多如牛毛的语 04/22 01:49
14F:→ loveflames: 法省略规定 04/22 01:49
15F:→ loveflames: 如果碰到metaprogramming就更可怕 04/22 01:50
16F:推 doomleika: 光是i18n预设的compiler搞不好还在用ascii 04/22 01:50
17F:→ doomleika: 那是要用w_char还是第三方lib的unicode字串?如果有 04/22 01:52
18F:→ doomleika: 两个project要整合一个用w_char一个用wxWidget你要怎 04/22 01:53
19F:→ doomleika: 诸如此类的问题 04/22 01:53
20F:→ doomleika: 像java现在预设unicode,python有unicode字串或是三版 04/22 01:54
21F:→ doomleika: 直接预设帮你搞定 04/22 01:55
22F:推 doomleika: 很多别的语言预设应该弄好的问题到c++就是一堆毛 04/22 01:57
23F:推 micola: delete[] not delete 04/22 08:30
24F:推 Kalamu: 原PO的写法用delete没错吧! 04/22 08:56
25F:推 Rougun: 大家觉得Rust怎麽样呢 04/22 09:13
26F:→ brucetu: 我觉得this不是指标啊 04/22 09:26
27F:→ brucetu: 指标抓个CE找个单机游戏玩玩就懂了 04/22 09:27
28F:→ brucetu: 也不是什麽门牌跟实体的概念.. 04/22 09:27
29F:→ brucetu: int*跟int都是占用4byte存着值 本质一样 04/22 09:28
30F:→ atst2: 是实作的结果一样,本质不同,不同硬体,系统对int的长度 04/22 09:47
31F:→ atst2: 可不同啊, 现在认为一样是长久演变来的习惯 04/22 09:48
32F:→ brucetu: int长度也算在本质的范围吗.. 04/22 09:50
33F:→ brucetu: 真心推荐学习上看到很多*就晕的人 去玩一下CheatEngine 04/22 09:52
34F:→ brucetu: 找过一两个偏移 就懂指标运做起来是什麽意思 几层都一样 04/22 09:52
35F:→ yr: int *ptr 然後 delete a ,编不过吧,然後阵列要 delete [] 04/22 10:37
37F:→ dreamnook: 以前我都觉得我只是穿着泳圈在水面上呼吸 04/22 10:40
38F:→ dreamnook: 看完这个後...证明我是对的XD 04/22 10:41
39F:→ dreamnook: 445页 有空可以看看 可以了解为何c/c++很"深" 04/22 10:42
40F:推 elements: Rust 很好 04/22 11:16
41F:→ elements: 阿 值得学 04/22 11:16
※ 编辑: VVll (211.72.185.162), 04/22/2016 11:42:57
42F:→ ts04953635: this比较像是class吧,我觉得 04/22 12:47
43F:→ fjyang: 用C写OO是闭门造车的话,Liunx是自找麻烦? 04/22 12:55
44F:→ bibo9901: linux kernel 没有太多OO啊, 要看就看gtk+ 那就真的很丑 04/22 13:08
45F:推 femlro: 楼下c++之神 yoco 04/22 13:10
46F:推 iWRZ: Linux Kernel OO也还好吧....... 04/22 14:05
47F:推 sarafciel: 等记忆体位置可以取负值再来说int跟int*一样吧XD 04/22 14:45
48F:推 wxywxywxy: C也可以写出很棒的oo程式 但要花非常多的心力 04/22 15:40
49F:推 oread168: 帮请神 04/22 15:54
50F:→ x000032001: 负值只是一种表示法而已阿..电脑就只有01 哪来正负 04/22 17:46
51F:推 cobrasgo: 基本上C和C++是否能拿来类比就很有讨论空间了 04/22 18:20
52F:推 zebraseven: 你 malloc 前是不是忘了 type casting 04/22 19:12
53F:→ brucetu: 同样4byte你可以取成正值也可以取成负值啊…我的天R 反 04/22 21:50
54F:→ brucetu: 正难不难 看个人吧 04/22 21:50
55F:→ brucetu: 纠结在语言规范说很难 我只觉得那叫很杂 没什麽令人看不 04/22 21:52
56F:→ brucetu: 懂的东西 就是多而已 包括那445页的pdf也是 就是规则多 04/22 21:52
57F:→ brucetu: 很杂而已 要这样比 那个语言没有一堆自己的规则呢 04/22 21:52
58F:→ doomleika: 懂这些只觉得未来新人进来会很辛苦 04/22 22:01
59F:→ GoalBased: C# 语言规格 500页 04/23 01:01
60F:推 iWRZ: Thinking in Java 整本厚度和重量可以拿来当杀人凶器 04/23 01:24
61F:推 kwpn: 3楼搞错啦,是C++/CLI有加入GC机制,不是C++ 04/23 06:12
62F:→ remmurds: java目前还没有真正的泛型 java的泛型比较像是语言特色 04/23 08:49
63F:→ remmurds: 所以在执行阶段时会出现大量的type casting 因为在JVM那 04/23 08:50
64F:→ remmurds: 层通通都被当成object来存 04/23 08:50
65F:→ remmurds: .NET记取了java的缺点 在泛型的设计上跟java有很大的不 04/23 08:51
66F:→ remmurds: 同 执行阶段没有type casting的问题 04/23 08:51
67F:→ duckfly: JAVA泛型会这麽设计是为了相容之前没泛型只用Object的写 04/23 13:00
68F:→ duckfly: 法,有着历史包袱没法像C#可以砍掉重练 04/23 13:00
69F:推 loveflames: 回kwpn,minimal GC後来没进入标准?我倒没注意 04/23 13:47
70F:推 kuope: Thinking in Java这本书有两种变成凶器的方式 04/23 16:07
71F:→ kuope: 一种是直接挥击被害人的头部 04/23 16:07
72F:→ kuope: 另一种是让被害人整本嗑完 04/23 16:07
73F:→ kuope: 我不知道那一种比较惨… 04/23 16:07
74F:→ newstar2007: c++没有原生的应用层library 造成後续很多程式整合上 04/25 01:42
75F:→ newstar2007: 极度的麻烦 光是搞字串这东西就花掉一半的开发时间了 04/25 01:43
76F:→ newstar2007: 如果再扯到微软过去开发又舍弃的东西 根本灾难 04/25 01:44