C++概论C语言过度版Word文档下载推荐.docx
- 文档编号:21407744
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:18
- 大小:36.73KB
C++概论C语言过度版Word文档下载推荐.docx
《C++概论C语言过度版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++概论C语言过度版Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
因此,初学者学习C++应该选择针对C++语言本身的书籍,而不能是针对VisualC++、MFC或者WindowsAPI的。
学习C++应该由易至难,循序渐进。
以前经常有人说学习C++之前应该学习C语言。
事实上那不是必须的,C++和C语言虽然有关系,但仍然是两种不同的语言。
当然,在学习C++之前学习过其他编程语言是很有好处的。
那会使学习C++的速度更快,毕竟很多计算机语言的概念都是相通的。
而对于零基础的初学者来说,则是应该静下心来,不要急躁。
要成为C++的高手,不是那么容易的,必须要花很大的努力。
从入门教材的选择上,主要看学习者的自身情况。
如果已经有过学习高级语言的经历,那么推荐使用谭浩强的《C++程序设计》。
注意是04年版的,06年版的那本书是阉割版,上来就面向对象。
虽然说C和C++是相似的,但是前面已经说了,C和C++应该作为两种语言来学习,所以06年的那本内容就稍微欠缺一点了。
谭浩强04版的这本书内容比较规整的,条理也很清晰。
如果有过其他高级语言的基础,那么估计半年就能对C++的概况有个了解了。
谭浩强老师的书已经成为了全国各大高等院校的教科书,是比较受到认可的。
如果是从零基础开始学C++,那么推荐使用潘嘉杰的《易学C++》。
这本书是2008年出的新书,听说是个学生在读书的时候写的。
这本书网上有下载免费的电子版。
这本书主要就是针对初学者的,讲得也比较生动有趣,比较提得起学习的兴趣。
所以没有基础的初学者选这本书也是不错的,就是想要很快成为高手,可能看这本书还不够。
至于看完入门的书之后,就应该看一些高层次的书了。
比如<
<
TheC++ProgrammingLanguage>
>
和<
C++Primer>
,同时也可以向STL、MFC、API等各个方向发展。
如果对别的语言感兴趣,还能去看看C#和Java,它们和C++从语法和很多概念上都是类似的。
设计原则
·
C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。
C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。
C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。
C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。
C++避免平台限定或没有普遍用途的特性。
C++不使用会带来额外开销的特性。
C++设计成无需复杂的程序设计环境。
出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。
关于此类话题,C++之父的《C++语言的设计和演化》里做了详尽的陈述。
HelloWorld程序
在使用兼容C89标准(也称为ANSIC)的编译器时,下面这个程序显示“Hello,world!
”然后结束运行:
(事实上这并不是符合98标准[ISOC++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将stdio.h改为iostream.h)
#include<
stdio.h>
intmain()
{
printf("
Hello,world!
\n"
);
return0;
}
(以上是c语言代码,c++语言是c语言高一级的版本)
在使用兼容C++98标准(ISO/IEC14882-1998)的编译器时,下面的程序也是可以的:
iostream.h>
cout<
"
"
<
endl;
}
在使用兼容C++STL的编译器时,应当是:
iostream>
usingnamespacestd;
cout<
Hello,world!
endl;
根据ISOC++的规定,main函数的形式只能是
intmain(void)
...
以及
intmain(intargc,char*argv[])
尽管如此,但在VisualC++2003以前的MicrosoftVisualStudio编译器上,
voidmain()
也被支持,但这并不正确,也不标准。
这样的写法会使程序代码丧失跨平台的特性。
每年都有专业人士规定C++的语法,这也是C++优于其他编程语言的原因之一,由它衍生的Java已成为通用编程语言中广受欢迎的一种。
代码性能
一般认为,使用Java或C#的开发成本比C++低。
但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。
这个条件就是:
软件规模和复杂度都比较小。
如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。
否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。
造成这种差别的就是C++的软件工程性。
在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。
这一点被多数人忽视,并且被大公司竭力掩盖。
语言在软件工程上的好坏,依赖于语言的抽象能力。
从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。
但在实践中,人们发现面向对象无法解决所有软件工程中的问题。
于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。
(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。
应用实例
哪些程序是用C++写的:
主流的3种操作系统Windows内核都是用C语言和汇编写的,上层高级特性是用C++写的。
《魔兽世界》等几乎所有的网络游戏,XX搜索引擎,我们所用的大多数软件都是用C++写的(硬件也有很多用到C++的)。
以下是一些C++的应用:
Amazon:
Softwareforlarge-scalee-commerce
Apple:
OSXiswritteninamixoflanguage,butafewimportantpartsareC++(当然最核心的部分都是汇编与c语言).
AT&
T:
ThelargestUStelecommunicationsprovider.
oprovisioningsystems
osystemsforrapidnetworkrecoveryafterfailure
Autodesk:
AlargenumberofmajornumberofapplicationintheCADdomain
Ericsson:
oserverplatform.
oTDMA-CDMAHLR
oGSM-TDMA-CDMAmobilitygateway
Google:
websearchengine,etc。
HP:
HereisatinyfractionofHP'
sC++apps:
oC,C++,Fortran90compilers,andlinkerforthenewHPIA64platform(theseaddtomorethan1millionlinesofC++code).
IBM:
oOS/400.
oK42:
ahighperformance,opensource,general-purposeoperatingsystemkernelforcache-coherentmultiprocessors.
Intel:
oVtuneperformaceanalysissoftware
ocompilersandoptimizers
olotsofchipdesignandmanufacturingsoftware
JPL
(JetPropulsionLab,
NASA):
Marsroverautonomousdrivingsystem(incl.sceneanalysisandrouteplanning).C++onMars!
Alsolotsofsupportingsoftware"
ontheground"
(i.e.Earth).
Microsoft:
oWindowsXP
oWindowsNT(NT4and2000)
oWindows9x(95,98,Me)
oMicrosoftOffice(Word,Excel,Access,PowerPoint,Outlook)
oInternetExplorer(includingOutlookExpress)
oVisualStudio
oSQL
Mozilla:
FirefoxbrowserandThunderbirdmailclient(opensource)
MySQL:
MySQLServer(about250,000linesofC++)andMySQLCluster.Arguablytheworld'
smostpopularopensourcedatabase
Nokia:
oMobileCommunicationsradio-station/internetbridges:
FlexiGGSN(GatewayGPRSSupportNode)andFlexiSGSN(ServerGPRSSupportNode).
oMSC/HLR
Sun:
oTheHotSpotJavaVirtualMachineiswritteninC++
SymbianOS:
rationale:
[...]usingC++forallsystemcode,fromthekernelupwards."
ThisisoneofthemostwidespreadOS'
sforcellularphones
KDE
fromlinuxiswritteninC++.
telephonesystems:
Ithinkitwouldbealmosteasiertolistthesystemswhicharen'
twritteninC++
C++写出的软件,还包括
VLC,著名的开源视频播放器;
LAMMPS,著名分子动力学模拟软件,其中包括一部分Fortran代码;
编程技巧
使用new和delete进行动态内存分配和释放
运算符new和delete是C++新增的运算符,提供了存储的动态分配和释放功能。
它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。
使用new较之使用malloc()有以下的几个优点:
(1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。
(2)自动地返回正确的指针类型,不用进行强制指针类型转换。
(3)可以用new对分配的对象进行初始化。
使用例子:
(1)int*p;
p=newint[10];
//分配一个含有10个整数的整型数组
delete[]p;
//释放这个指向数组的指针所占内存
(2)int*p;
p=newint(100);
//动态分配一个整数并初始化
使用inline内联函数替代宏调用
对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。
但是宏调用有许多的弊端,可能引起不期望的副作用。
例如宏:
#defineabs(a)(a)<
0?
(-a):
(a)),当使用abs(i++)时,这个宏就会出错。
所以在C++中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。
使用内联函数只须把inline关键字放在函数返回类型的前面。
例如:
inlineintAdd(inta,intb);
//声明Add()为内联函数
这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。
使用函数重载
在C语言中,两个函数的名称不能相同,否则会导致编译错误。
而在C++中,函数名相同而参数数据类型不同的两个函数被解释为重载。
voidPutHz(char*str);
//在当前位置输出汉字
voidPutHz(intx,?
inty,?
char*str);
//在x,y处输入数字
使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;
同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。
同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。
用引用(reference)代替指针进行参数传递
在C语言中,如果一个函数需要修改用作参数的变量值的时候,参数应该声明为指针类型。
voidAdd(int*a)
{
(*a)++;
}
调用时则使用
Add(&
x);
//其中x为int或可以转化为int的类型,如unsignedint,但这时候编译器通常会给出warning
对于复杂的程序,使用指针容易出错,程序也难以读懂。
在C++中,对于上述情况可以使用引用来代替指针,使程序更加清晰易懂。
引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。
例如使用引用的函数定义为:
voidAdd(int&
a)
a++;
//a为一个整数的引用
调用时使用
Add(x);
//其中x为int
这个函数与使用指针的上一个函数的功能是一样的,然而代码却更为简洁和清晰易懂。
使用缺省参数
在C++中函数可以使用缺省参数,例如:
voidPutHzxy(char*str,intx=-1,inty=-1)
if(x==-1)
x=wherex();
if(y==-1)
moveto(x,y);
PutHx(str);
可以有三种方式调用函数PutHzxy(),例如:
PutHzxy("
C++语言"
//使用缺省参数,在当前位置输出
10,10);
//没有使用缺省参数
10);
//对y使用缺省参数,指定x的位置
通常的情况下,一个函数应该具有尽可能大的灵活性。
使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法,所以在C++的代码中都大量地使用了缺省参数。
需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。
亦即,一旦开始定义缺省参数,就不可再说明非缺省的参数。
否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。
例如:
voidPutHzxy(char*str,intx=-1,inty=-1)//正确
voidPutHzxy(intx=-1,inty=-1,char*str)//错误
使用STL
STL(StandardTemplateLibrary,标准模板库),STL的代码从广义上讲分为三类:
algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。
几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
#include<
vector>
//包含相关的头文件/
typedefstd:
:
vector<
int>
intvector;
//使用typedef使代码看起来更简洁
intmain()
intvectorvi;
for(inti=0;
i<
10,i++)
vi.push_back(i);
//使用push_back添加元素
vi.size();
i++)
std:
vi[i]<
;
//[]操作符被重载,使得我们可以像访问数组一样访问vector中的元素
开发方式
在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。
一般是如下组合:
1.编译器:
gcc,clang等
2.编辑器:
一般是vim/emacs
3.make:
gnumake或者bsd的pmake等,功能与用法基本一样
4.版本管理:
cvs,svn,git等
5.代码阅读:
cscope,ctags,lxr等
开发环境
1.VisualStudio(VisualC++)
2.Borland
C++Builder
3.Eclipse(Myln+CDT+Mingw32+GCC)
4.Dev-C++(Mingw32+GCC)
5.Code:
Blocks(可配合多款编译核心使用)
6.Codelite
7.C-Free
如上所示,目前流行的GNUGCC和微软的VisualStudio系列各执一套基本的编译链,其他的IDE都是衍生产品
经典著作
●《TheC++StandardLibrary:
ATutorialandReference》
中文版:
《C++标准程序库:
自修教程与参考手册》
百科全书式的C++标准库著作,一本需要一再查阅的参考大全。
本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。
正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。
浅显易懂的写作风格使得这本书非常易读。
●《StandardC++IOStreamsandLocales:
AdvancedProgrammer'
sGuideandReference》
中文版《标准C++输入输出流与本地化》
●《EffectiveSTL》
使用STL的程序员必读之作。
在这本书中,Scott讲述了STL容器和算法的工作机制以及如何以最佳方式使用它们。
和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。
●影印版《GenericPro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 概论 语言 过度