c++语言最难学的是什么
作为一个用了3年多C/C++的程序狗,我来说两句。
说到C++的难点,其实很多地方是一言难尽的。我不敢声称我精通C++,我甚至觉着八成的人都不能这么说。甚至我可以确定,在我工作的过程中我肯定是没有用过C++所有的语言特性,甚至有些语言特性到现在看来我都觉着是天书。
C++的坑太多了,简单说几点:
指针并不能简单算做是C++的痛点,这个特性继承自C,它带来的问题很多:当你的程序莫名崩溃,你就要好好考虑下,是不是出了野指针,或者你的程序有MemoryLeak?这个对新手来说简直是地狱,如果再混下多线程,OMG,谁能告诉我这个对象的生命周期到底应该如何管理。也许你需要make_shared,但是你要知道,半自动的内存管理要用好也是要花功夫的,而且仍然不能杜绝问题的产生。
跨平台。也许有人跟你说过 C++跨平台,一份代码在不同的平台上都能找到编译器来编译。这句话本身没错,问题在于,有没有人告诉过你,不同的编译器对C++标准支持是不一样的?C++的跨平台在我看来就是宏预处理堆砌出来的跨平台。这个对Java或者C#的程序员来说,会崩溃的。你见没见过有语言上来就重新定义自己的int,long类型的?你去看大型的C++项目,尤其是有年头或者有历史沿袭的,基本都这么干过。为什么?因为早些年大家没啥好办法,为了让自己的程序在不同平台上的表现尽量一致,只能自己把基本类型重定义一遍。
stl,说到这个一脸泪。stl好用吗?很好用。stl好学吗?一点也不好学。它的学习成本太高了,而且代码晦涩。C++的模板库基本都是一个德行。如果你发现你看不懂你常用的std::vector<>里的代码,很正常,这种模板的语法习惯起来需要时间。很多人诟病stl太大,内存释放效率低,不同平台实现不一致等等问题。关于这个不一致的问题,我们来说一下:windows平台vc自己实现了stl。linux上gnu实现了gnu stl。android平台早些年用stlport,据说是个经典的实现版本,后来换用了gnu的实现。mac上苹果的clang用的是不是自己实现的还是直接用了gcc的不太清楚,没有用过水果的产品做开发。那么stl在C++上处于一种什么地位?它就是C++的标准模板库啊?用过java和C#的都知道,标准库是个什么地位。离了它们不出活啊。也许我们可以重新写一个?ok,在java,C#上你是看不到的,但苦逼的C++众不少人这么干过,或者早些年在stl功能简陋的时候曾经这么干过。EA就专门针对游戏开发写过一个EASTL,还是开源的。对于一个语言来说,标准库如此的不统一,实在是令人头大。
C++11 这个可以拿来所说的,总体来说不算缺点。C++11对于C++来说试一次很彻底的进化。解决了很多问题,引入了lambda,新的右值引用,新的智能指针等等。当时为什么要列在这里呢?学习成本啊 亲。我们就说引用,以前我们有普通的值引用,常量引用,现在我们多了一个右值引用。没错,现在右值也可以有引用了。什么,你不清楚引用,常量,左值和右值的概念?正常,在没有右值引用之前,我就没在意过左值和右值的区别。现在不一样了啊,扔给你个std::move std::forword 为了会用,你还要滚回去把左值和右值白扯清楚。
看到有人说类,补充一个。我觉着C++的类模型设计上是有问题的。而且多继承现在的普遍观点是这是个缺点大过优点的特性。单继承+受限类的多继承目前比较有市场。可以看看Java8,它就是这么干的。还有就是支持重载必须显式声明为virtual,而且子类中是看不出基类中是否有virtual声明的。这个是个有点扯淡的要求。因为在一个庞大的继承树中,你可能需要跟踪到继承树的根节点才能知道到底是不是virtual的。个人理解可以由编译器自行推断,但是现有的标准并没有这么做,不知道是为了兼容还是觉着这么做会带来问题。我们来看一下常用的关于类的C++语言特性:多继承,虚函数,构造函数,析构函数,拷贝构造函数,运算符重载,公有继承私有继承保护继承,友元函数友元类,静态成员。这是我能想到的,C++类的复杂度绝对是超过java和C#的。就一个多继承时多级父类的构造和析构过程就够新手挠头一阵的。
大概上是这样,这个是我说理解的C++存在的问题。如果你去知乎上搜,可以找到更多。比如ABI接口兼容问题,跨dll的内存释放问题,自动构造析构导致你根本无法精确控制内存,不去做专门了解,你都不知道编译器产生过几个临时对象,它们又在何时产生了析构。
对C的兼容,对多种编程范式的支持,新语法的不断加入,不同编译器标准的支持力度,平台相关性带来的跨平台问题等等困扰着C++。它仍然是一门好语言,但并不完美,它不对你的使用做出任何的假定和限制,所以如果你滥用这些过于灵活和强大的特性,程序肯定会崩给你看的。
以上。
2013-05-11
这部分内容太多了,而且几乎包括了所有运行时崩溃的错误调试难题……
因为一旦崩溃跳出来的对话框一般都是告诉你某某内存地址访问出错……
学好C这块就不是很难了
2013-05-11
2020-11-18 · IT、电竞电商、设计、动漫专业对口升学
推荐于2018-03-29
其实C语言的入门并不是很难,当然对于一些完全零基础的可能会有一些困难,但是不要放弃,坚持下去,你会慢慢发现一切变简单了。
平时可以多看看网上的视频教程,多写点代码,加强知识的记忆和运用。
2.可以针对自己的兴趣将C语言运用起来,可以写点小游戏再学习中也找到编程的乐趣就能更好的学习下去。
3.建议前期不要看太高深的书籍,以免打击信心。