初学者应当如何学习C++以及编程Word格式文档下载.docx
- 文档编号:20535573
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:19
- 大小:30.71KB
初学者应当如何学习C++以及编程Word格式文档下载.docx
《初学者应当如何学习C++以及编程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《初学者应当如何学习C++以及编程Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
标榜?
都不是,开发库的实际需求。
但这也正是最大的悲哀了。
在boost里面因实际需求而动用语言细节最终居然能神奇的完成任务的最好教材就是boost:
foreach,这个小设施对语言细节的发掘达到了惊天地泣鬼神的地步,不信你先试着自己去看看它的源代码,再看看作者介绍它的文章吧。
而boost:
typeof也不甘其后——C++语言里面有太多被“发现”而不是被“发明”的技术。
难道最初无意设置这些语言规则的家伙们都是Oracles?
因为没有variadictemplates,人们用宏加上缺省模板参数来实现类似效果。
因为没有concepts,人们用模板加上析构函数的细节来完成类似工作。
因为没有typeof,人们用模板元编程和宏加上无尽的细节来实现目标…C++开发者们的DIY精神不可谓不强。
然而,如果仅仅是因为要开发优秀的库,那么涉及这些细节都还是情有可原的,至少在C++09出现并且编译器厂商跟上之前,这些都还能说是不得已而为之。
但我们广大的C++程序员呢?
大众是容易被误导的,我也曾经是。
以为掌握了更多的语言细节就更牛,但实际却是那些语言细节十有八九是平时编程用都用不到的。
C++中众多的细节虽然在库设计者手里面有其用武之地,但普通程序员则根本无需过多关注,尤其是没有实际动机的关注。
一般性的编码实践准则,以及基本的编程能力和基本功,乃至基本的程序设计理论以及算法设计。
才是真正需要花时间掌握的东西。
学习最佳编码实践比学习C++更重要。
看优秀的代码也比埋头用差劲的编码方式写垃圾代码要有效。
直接、清晰、明了、KISS地表达意图比玩编码花招要重要…
避免去过问任何语言细节,除非必要。
这个必要是指在实际编程当中遇到问题,这样就算需要过问细节,也是最省事的,懒惰者原则嘛。
一个掌握了基本的编程理念并有较强学习能力的程序员在用一门陌生的语言编程时就算拿着那本语言的圣经从索引翻起也可以编出合格的程序来。
十年学会编程不是指对每门语言都得十年,那一辈子才能学几门语言哪,如果按字母顺序学的话一辈子都别指望学到Ruby了;
十年学习编程更不是指先把语言特性从粗到细全都吃透才敢下手编程,在实践中提高才是最重要的。
至于这种抠语言细节的哲学为何能在社群里面呈野火燎原之势,就是一个心理学的问题了。
想像人们在论坛上讨论问题时,一个对语言把握很细致的人肯定能够得到更多的佩服,而由于论坛上的问题大多是小问题,所以解决实际问题的真正能力并不能得到显现,也就是说,知识型的人能够得到更多佩服,后者便成为动力和仿效的砝码。
然而真正的编程能力是与语言细节没关系的,熟练运用一门语言能够帮你最佳表达你的意图,但熟练运用一门语言绝不意味着要把它的边边角角全都记住。
懂得一些常识,有了编程的基本直觉,遇到一些细节错误的时候再去查书,是最节省时间的办法。
C++的书,Bjarne的圣经《TheC++ProgrammingLanguage》是高屋建瓴的。
《大规模C++程序设计》是挺务实的。
《AcceleratedC++》是最佳入门的。
《C++Templates》是仅作参考的。
《C++TemplateMetaprogramming》是精力过剩者可以玩一玩的,普通程序员碰都别碰的。
《ISO.IECC++Standard14882》不是拿来读的。
Bjarne最近在做C++的教育,新书是绝对可以期待的。
P.S.关于如何学习编程,g9的blog上有许多精彩的文章:
这里,这里,这里,这里…实际上,我建议你去把g9老大的blog翻个底朝天:
P
再P.S.书单?
我是遑于给出一个类似《C++初学者必读》这种书单的。
C++的书不计其数,被公认的好书也不胜枚举。
只不过有些书容易给初学者造成一种错觉,就是“学习C++就应该是这个样子的”。
比如有朋友提到的《高质量C/C++编程》,这本书有价值,但不适合初学者,初学者读这样的书容易一叶障目不见泰山。
实际上,正确的态度是,细节是必要的。
但细节是次要的。
其实学习编程我觉得应该最先学习如何用伪码表达思想呢,君不见《IntroductiontoAlgorithm》里面的代码?
《TAOCP》中的代码?
哦,对了它们是自己建立的语言,但这种仅教学目的的语言的目的就是为了避免让写程序的人一开始就忘了写程序是为了完成功能,以为写程序就是和语言细节作斗争了。
Bjarne说程序的正确性最重要,boost的编码标准里面也将正确性列在性能前面。
此外,一旦建立了正确的学习编程的理念,其实什么书(只要不是太垃圾的)都有些用处。
都当成参考书,用的时候从目录或索引翻,基本就对了。
再再P.S.myan老大和g9老大都给出了许多精彩的见解。
我不得不再加上一个P.S。
具体我就不摘录了,如果你读到这里,请务必往下看他们的评论。
转载者别忘了转载他们的评论:
-)
许多朋友都问我同一个问题,到底要不要学习C++。
其实这个问题问得很没有意义。
“学C++”和“不学C++”这个二分法是没意义的,为什么?
因为这个问题很表面,甚至很浮躁。
重要的不是你掌握的语言,而是你掌握的能力,借用myan老大的话,“重要的是这个磨练过程,而不是结果,要的是你粗壮的腿,而不是你身上背的那袋盐巴。
”。
此外学习C++的意义其实真的是醉翁之意不在酒,像C/C++这种系统级语言,在学习的过程中必须要涉及到一些底层知识,如内存管理、编译连接系统、汇编语言、硬件体系结构等等等等知识(注意,这不包括过分犄角旮旯的语言枝节)。
这些东西也就是所谓的内功了(其实最最重要的内功还是长期学习所磨练出来的自学能力)。
对此大嘴Joel在《JoelOnSoftware》里面提到的漏洞抽象定律阐述得就非常漂亮。
所以,答案是,让你成为高手的并不是你掌握什么语言,精通C++未必就能让你成为高手,不精通C++也未必就能让你成为低手。
我想大家都不会怀疑g9老大如果要抄起C++做一个项目的话会比大多数自认熟练C++的人要做得漂亮。
所以关键的不是语言这个表层的东西,而是底下的本质矛盾。
当然,不是说那就什么语言都不要学了,按照一种曹操的逻辑,“天下语言,唯imperative与declarative耳”。
C++是前者里面最复杂的一种,支持最广泛的编程范式。
借用当初数学系入学大会上一个老师的话,“你数学都学了,还有什么不能学的呢?
学语言是一个途径,如果你把它用来磨练自己,可以。
如果你把它用来作为学习系统底层知识的钥匙,可以。
如果你把它用来作为学习如何编写优秀的代码,如何组织大型的程序,如何进行抽象设计,可以。
如果掉书袋,光啃细节,我认为不可以(除非你必须要用到细节,像boost库的coder们)。
位域具体存放数值测试
#include<
iostream>
#include<
windows.h>
usingnamespacestd;
voidmain()
{
structtest
//在这里测试就可以发现其规律,有无unsigned、a:
1a:
2a:
4a:
8a:
16a:
32以及用char的各值来试验就可发现位域的规律
unsignedinta:
8;
};
testt1;
t1.a=0;
cout<
<
"
十进制
->
0:
"
dec<
t1.a<
endl;
十六进制->
hex<
t1.a=1;
1:
t1.a=2;
2:
t1.a=3;
3:
t1.a=126;
126:
t1.a=127;
127:
t1.a=128;
128:
t1.a=129;
129:
t1.a=253;
253:
t1.a=254;
254:
t1.a=255;
255:
t1.a=256;
256:
t1.a=257;
257:
t1.a=258;
258:
t1.a=259;
259:
t1.a=260;
260:
t1.a=261;
261:
t1.a=262;
262:
t1.a=263;
263:
t1.a=264;
264:
t1.a=65533;
65533:
t1.a=65534;
65534:
t1.a=65535;
65535:
t1.a=65536;
65536:
t1.a=65537;
65537:
}
从STL中学习泛型编程
最近在看数据结构方面的书籍,遇到了泛型编程方面的问题,以前遇到的泛型编程问题不多,大多数也已经遗忘,于是打算重新捡起来。
下面一段关于泛型编程的定义摘抄于XX百科,应该能概括什么事泛型编程。
泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。
泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。
所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。
STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。
STL以迭代器(Iterators)和容器(Containers)为基础,是一种泛型算法(GenericAlgorithms)库,容器的存在使这些算法有东西可以操作。
STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(functionobjects)。
STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。
上面的概括只是从理论上解释了什么是泛型,可是看过后还是不知道怎么使用泛型,于是乎笔者找到了STL中定义的头文件,下面就一步一步解开泛型的秘密。
由于原版的STL中很多类的套嵌,不便于解释,所以简化了STL,以下以vector容器为例:
文件名:
vector.h
1:
template<
classObject>
//模板定义了Object类型,在使用的时候可以以任何类型代替此类型
2:
classvector
3:
{
4:
public:
5:
explicitvector(intinitSize=0):
theSize(initSize),theCapacity(initSize+SPARE_CAPACITY)//重点注意构造函数的定义,构造函数支持两种方式初始化vector容器,这下知道怎么用vector了吧
6:
{objects=newObject[theCapacity];
}
7:
vector(constvector&
rhs):
objects(NULL)
8:
{operator=(rhs);
9:
~vector()
10:
{delete[]objects;
11:
12:
boolempty()const
13:
{returnsize()==0;
14:
intsize()const
15:
{returntheSize;
16:
intcapacity()const
17:
{returntheCapacity;
18:
19:
Object&
operator[](intindex)
20:
21:
#ifndefNO_CHECK
22:
if(index<
0||index>
=size())
23:
throwArrayIndexOutOfBoundsException(index,size());
24:
#endif
25:
returnobjects[index];
26:
27:
28:
constObject&
operator[](intindex)const
29:
30:
31:
32:
33:
34:
35:
36:
37:
constvector&
operator=(constvector&
rhs);
38:
voidresize(intnewSize);
39:
voidreserve(intnewCapacity);
40:
41:
//Stackystuff
42:
voidpush_back(constObject&
x);
43:
voidpop_back();
44:
back()const;
45:
46:
//Iteratorstuff:
notboundschecked
47:
typedefObject*iterator;
48:
typedefconstObject*const_iterator;
49:
50:
iteratorbegin()
51:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 初学者 应当 如何 学习 C+ 以及 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)