Re: [讨论] c++真的很难吗?

楼主: VVll (李奥纳多皮卡丘)   2016-04-22 00:51:55
※ 引述《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++了
作者: freeunixer (御剑客)   2016-04-22 01:10:00
是 Java/C# 只能 ref 不能 ptr ,就搞不懂 ptr 在干啥.学 Java/C# 的 ref 以为是 ptr,学过 C++ 才知道并不是
作者: loveflames (咕啾咕啾魔法阵)   2016-04-22 01:22:00
其实C++用smart ptr比较好,还有C++也加入GC机制了
作者: doomleika (iSuck)   2016-04-22 01:38:00
没有finally强迫要用RAII不然等著resource leak一堆undefined behavior出错又不会告诉你有问题Double delete把heap搞烂大概一个星期就没了编译器对标准不是100%实作有些功能看得到吃不到标准函式库在应用面太弱变成要实务些东西又要看第三方lib,然后不同lib写法有不一样有一堆选择,也不像一堆语言有规定一个写法或conventio变成procedure/OO/generic全部都要会不能只会一种,不然没办法维护legacy code
作者: loveflames (咕啾咕啾魔法阵)   2016-04-22 01:49:00
C++同样一件事可以用一堆语法来写,还有多如牛毛的语法省略规定如果碰到metaprogramming就更可怕
作者: doomleika (iSuck)   2016-04-22 01:50:00
光是i18n默认的compiler搞不好还在用ascii那是要用w_char还是第三方lib的unicode字串?如果有两个project要整合一个用w_char一个用wxWidget你要怎诸如此类的问题像java现在默认unicode,python有unicode字串或是三版直接默认帮你搞定很多别的语言默认应该弄好的问题到c++就是一堆毛
作者: micola (Logical way)   2016-04-22 08:30:00
delete[] not delete
作者: Kalamu (Kalamu9)   2016-04-22 08:56:00
原PO的写法用delete没错吧!
作者: Rougun (Rougun)   2016-04-22 09:13:00
大家觉得Rust怎么样呢
作者: brucetu (sec)   2016-04-22 09:26:00
我觉得this不是指标啊指标抓个CE找个单机游戏玩玩就懂了也不是什么门牌跟实体的概念..int*跟int都是占用4byte存著值 本质一样
作者: atst2 (atst2)   2016-04-22 09:47:00
是实作的结果一样,本质不同,不同硬件,系统对int的长度可不同啊, 现在认为一样是长久演变来的习惯
作者: brucetu (sec)   2016-04-22 09:50:00
int长度也算在本质的范围吗..真心推荐学习上看到很多*就晕的人 去玩一下CheatEngine找过一两个偏移 就懂指标运做起来是什么意思 几层都一样
作者: yr (Sooner Born Sooner Bred)   2016-04-22 10:37:00
int *ptr 然后 delete a ,编不过吧,然后阵列要 delete []
作者: dreamnook (亚龙)   2016-04-22 10:40:00
http://www.slideshare.net/olvemaudal/deep-c以前我都觉得我只是穿着泳圈在水面上呼吸看完这个后...证明我是对的XD445页 有空可以看看 可以了解为何c/c++很"深"
作者: elements (Helianthus annuns)   2016-04-22 11:16:00
Rust 很好阿 值得学
作者: ts04953635 (阿G)   2016-04-22 12:47:00
this比较像是class吧,我觉得
作者: fjyang (自由的风)   2016-04-22 12:55:00
用C写OO是闭门造车的话,Liunx是自找麻烦?
作者: bibo9901 (function(){})()   2016-04-22 13:08:00
linux kernel 没有太多OO啊, 要看就看gtk+ 那就真的很丑
作者: femlro (母猪教谋神异端审问官1.5)   2016-04-22 13:10:00
楼下c++之神 yoco
作者: iWRZ (NE~_~RO)   2016-04-22 14:05:00
Linux Kernel OO也还好吧.......
作者: sarafciel (Cattuz)   2016-04-22 14:45:00
等内存位置可以取负值再来说int跟int*一样吧XD
作者: wxywxywxy   2016-04-22 15:40:00
C也可以写出很棒的oo程式 但要花非常多的心力
作者: oread168 (大地的精靈R)   2016-04-22 15:54:00
帮请神
作者: x000032001 (版废了该走了)   2016-04-22 17:46:00
负值只是一种表示法而已阿..电脑就只有01 哪来正负
作者: cobrasgo (人鱼线变成鲔鱼线,超帅)   2016-04-22 18:20:00
基本上C和C++是否能拿来类比就很有讨论空间了
作者: zebraseven (Die walkuere)   2016-04-22 19:12:00
你 malloc 前是不是忘了 type casting
作者: brucetu (sec)   2016-04-22 21:50:00
同样4byte你可以取成正值也可以取成负值啊…我的天R 反正难不难 看个人吧纠结在语言规范说很难 我只觉得那叫很杂 没什么令人看不懂的东西 就是多而已 包括那445页的pdf也是 就是规则多很杂而已 要这样比 那个语言没有一堆自己的规则呢
作者: doomleika (iSuck)   2016-04-22 22:01:00
懂这些只觉得未来新人进来会很辛苦
作者: GoalBased (Artificail Intelligence)   2016-04-23 01:01:00
C# 语言规格 500页
作者: iWRZ (NE~_~RO)   2016-04-23 01:24:00
Thinking in Java 整本厚度和重量可以拿来当杀人凶器
作者: kwpn (ITSST)   2016-04-23 06:12:00
3楼搞错啦,是C++/CLI有加入GC机制,不是C++
作者: remmurds (Stronghold)   2016-04-23 08:49:00
java目前还没有真正的泛型 java的泛型比较像是语言特色所以在执行阶段时会出现大量的type casting 因为在JVM那层通通都被当成object来存.NET记取了java的缺点 在泛型的设计上跟java有很大的不同 执行阶段没有type casting的问题
作者: duckfly (Java ass)   2016-04-23 13:00:00
JAVA泛型会这么设计是为了相容之前没泛型只用Object的写法,有着历史包袱没法像C#可以砍掉重练
作者: loveflames (咕啾咕啾魔法阵)   2016-04-23 13:47:00
回kwpn,minimal GC后来没进入标准?我倒没注意
作者: kuope (伯伯)   2016-04-23 16:07:00
Thinking in Java这本书有两种变成凶器的方式一种是直接挥击被害人的头部另一种是让被害人整本嗑完我不知道那一种比较惨…
作者: newstar2007   2016-04-25 01:42:00
c++没有原生的应用层library 造成后续很多程式整合上极度的麻烦 光是搞字串这东西就花掉一半的开发时间了如果再扯到微软过去开发又舍弃的东西 根本灾难

Links booklink

Contact Us: admin [ a t ] ucptt.com