C++学习进度报告ver1.0(由于本人学习不认真这篇文章会有诸多问题,连参考的价值都没有。另外本篇文章几乎没有任何参考,如果与各种C++教材有出入说明我错了。并且应该会漏很多重要内容。【另外说明一下,这里面所有出现的程序都是我脑补的,会不可避免的出错,不要在意【)一、我对C++的理解1、C++是什么?C++是一种在C语言基础上优化发展出来的语言。C语言对于编程的难易度,直观性,编程量都有着很大的改变。然而C语言有自己的不足。C语言在处理大规模程序的时候,由于会经常并且过多的引用函数,使得整体直观性大幅下降,程序员在直接引用这些程序来达到自己的目的时,会难以修改。C的编程结构有自己的优势,在继承了这些优势的基础上,C++对于编程进行了“模块化”处理,也就是类的出现。类的好处在于,类并不是和程序绑定的固定结构,而是一个十分灵活的自我结构。它可以直接继承旧的类,也可以实现多态性——“同一命令对不同的对象实现不同的效果”。在C语言中大规模的程序,在C++中则是一个个类模板在程序员手下的组合。2、面向对象与面向过程的不同。传统的面向过程语言,是以程序为核心的,不同的目的对应不同的程序,缺乏灵活性。面向对象程序语言的重要特性之一就是模块化,面对不同的对象,实现不同的效果,将对象作为程序的核心。这样做的最大的好处是,程序的可读可改性大幅提高,同时可以直接引用自己需要的类通过资源共享大幅提高编程效率,而不再是死板的一个程序对应一个目标。C++的编写,像是拼积木一样,先构思一个框架,然后将自己需要的木块拿出来用就可以了,一个接着一个搭成大楼。而不像C语言,要直接把一个大楼设计出来。3、什么是编程?编程,在我的理解里,就是通过代码让计算机实现自己需要的目的。代码本身并不是编程的重点,只是起到一个媒介作用——让计算机能够“理解”人的想法。编程的重点是程序结构,也就是算法。所以一门语言不管学到什么样的程度,都不能改变它只是一种工具的本质,甚至对于语言只有基本的了解,然而通过查阅资料仍然可以实现目标。真正的编程的思想才是真正应该精益求精的东西。用程序代码实现程序结构,或者说算法,才是学习一门语言的目的,不应该将学习的目的本末倒置。另外必须要记得另一件事,一个成品程序是给人用的,所以程序的有效性快速性直观性都要有要求。二、C++概述1、程序结构函数等等。这一部分的基本思想是完全继承C语言的,因此本身并没有太多值得说的东西。但是C++在库方面,不光继承了C语言,还进行了增加。本部分主要对新加的内容进行力所能及的说明。(1)输入输出的变化在C语言中,printf打印和scanf输入是大家所熟知的。然而这些程序有着一些不方便的地方,比如针对不同的变量要进行不同的说明(%d,%c等等),并且一次只能完成一段话的输入或者输出。在C++中,iostream头文件让这件事情不再痛苦。流输入cin和流输出cout让编程方便许多。比较一下:C语言版本#includestudio.hIntmain(){Inta,b;Scanf(“%d,%d”,a,b);Prinft(“a是%d,b是%d。/n”,a,b);Prinft(“谢谢/n”);}C++版本#includeiostreamUsingnamespacestd;Intmain(){Inta,b;Cinab;Cout”a是”a”b是”bendl”谢谢”endl;}输入输出的结果应该是一样的(大概吧)。在这个简单的程序里并没有体现出来不用换行的好处了,然而当需要频繁输入输出的时候,你就自然懂得流输入流输出的好了。而且,最重要的是,cin,cout明显比prinft和scanf短!【【(这里稍微说明一下,usingnamespacestd是一个说明,很重要的说明。在程序里出现的cout,cin,endl都是std类下的函数,原本应该表示成std::cout,std::cin,std::endl,由于C++的版本不同,很多版本里是不支持直接使用cout,cin这些函数的,需要使用完整的版本,然而声明了std之后就可以不用再输入麻烦的std::了。Endl等价于‘/n’,iostream头文件里还有很多这样的函数,用哪个就看个人喜好就好。)(2)程序与逻辑结构完全!没有!区别!还是!Do-while,for,switch,ifelse这些东西,除了for有新的用法外其他的完全没有变。在程序结构上,主要是受算法影响,而不是受内容影响。C++在这方面基本上是完全抄袭C的。程序的框架仍然是靠循环,选择,嵌套来实现的。这些并不属于语言本身,而是数学思维的转化,没什么好讲的【【For的新用法大概是这样的for(表达式,变量),比如表达式里是一个字符串数组A[10],变量是c,那么这句话for(a[10],c)的意思是c从a[1]到a[10]循环一遍。这是一种很方便的用法。不过我没怎么用过,如果这段话有错我也没有什么办法【此外,基本符号,逻辑符号,位计算这些部分C++也是完全承袭C的。(3)数据类型我有言在先,这一部分我有很多地方自己也没有掌握好……首先是一些很基本的变量类型,char,int,double,flaot,等等等等,和C是完全一样的。这里稍微说一下一种比较特殊的变量,bool型变量,布尔变量,内容只有true和false,分别对应0和1。这个东西虽然是C语言的,但是很容易被遗忘……然后还有数据的声明和定义这种根本就是在玩文字游戏的文字游戏。简单的说就是未被声明的变量不能使用,未被定义的变量很可能是乱码。所以变量的初始化是很重要的。(Extern是专门用来声明变量的。我没用过)强制转化是一个很厉害的东西,可以将一种类型强制变成另一种类型,比如inta=1.0,将会将1.0强制变成1赋值给a。强制转化并没有我说的这么简单,还有很多我没有学或者学好的特殊用法。然而强制转化是一种非常不逻辑的行为,有悖编程逻辑化结构化的思想,所以必须慎用。接下来才是重头,组合类型。我力所能及,毁人不倦的说一点吧。①const限定符const是限制符(其实就是常数constant的缩写啦),使用了这个符号定义的变量,只能引用而不能修改。因此const一般用来在程序中定义一些不允许外部修改的常数,比如数学运算中的π,物理学中的这这常数和那那常数等。由于被const后,这个变量的内容就不能改变,所以使用const的时候,一定要记得变量的初始化。Const的用法是这样的constintpi=3.14,此后你用的所有pi只能是3.14。对pi的赋值或修改会引起程序报错。②数组和字符串数组和多维数组这一部分其实和C没有区别……但是还是要提醒,在C/C++中,一维数组的维数是必须提前确定的,而不能定义变量,比如inta[n]是不合法的。这点也就造成了数组在有些场合的不灵活(比如删减数组成员)数组的初始化,最简单的,a[10]={0}。然而如果是非0初始化,则要一个一个赋值,比较麻烦,尤其是处理大数组的时候。特别的,多维数组,只需要确定的最小的维数就可以,程序会根据初始化的内容自动分配。比如inta[][2]={1,2,3,4,5,6,7}是合法的,赋值后a会自动变成a[4][2]。字符串数组……其实差不多没什么讲的啦……然后,C++里有几个很方便的库用来处理数组,string字符串类和vector向量类。在使用的时候分别需要string、vector库。String里面有很多很强大的功能,比如字符串数组,经常会因为实际用不到那么多而浪费空间,而string类型的字符串可以是任意长度,比如,stringa;Cina;而vector里面则是可以很方便的对一个数组进行赋值。比如vector(int)a(10,1)将十个1赋值给了a数列。String和Vector还有很多功能,然而我并没有怎么深入的看这一块,所以暂时还不知道怎么用……③指针和引用指针是C语言的噩梦,然而到了C+这个噩梦也还是个噩梦。其实指针本身的内容和C并没有什么出入。所以就不细讲了【【简单说一点我个人的理解吧。对于一个初学者来说,指针是个很不友好的东西,因为指针千变万化。但是万变不离其宗,指针永远不会变的一点,是指针存放的是变量的地址。因此对指针变量本身的很多操作是没有意义的,我们的目的是通过地址来访问或者改变一个变量。但是指针非常灵活,只有在实际运用和对程序的分析中才能很好的理解吧,我还需要多用。但是使用指针有几点是要注意的:1、指针变量类型应该和指针所指向的变量变量类型一致,比如int*p=&a,a必须是int类型变量。2、在数组中,指针指向数组首地址。所以很多数组的计算可以用指针来替代。这里特别说明一下&。在C++里,&不仅有取址功能,还有一个新的功能,引用。比如int&r=a,经过这样的声明后,r是一个完全和a等价的变量,除了名字不同没有不同。你可能会问了,这样做不是多此一举吗?我一开始也是这么想的,然而深入了解后发现,我真是太naive了。在函数的引用中,函数调用的形参并不会影响参数本身,比如Voidswap(inta,intb){Inttemp;A=temp;A=b;B=temp;}这样的一个函数的效果很明显是交换a和b的值,然而由于这里面的a和b并不是实际的a和b,在真正的运行了程序之后,你会惊奇地发现,wtf!程序没有报错!他们根本没有变!这个时候有两个办法解决。第一个是用指针,交换地址而不是变量本身:Voidswap(int*a,int*b){Inttemp;*a=temp;*a=*b;*b=temp;}在程序中,将变量的地址赋值给a和b,然后交换a和b,虽然并不影响主程序本身,然而由于交换了变量地址,所以实际上的变量已经被交换了。而第二种方法,是利用&aVoidswap(int&a,int&b){Inttemp;a=temp;a=b;b=temp;}第二种方法,则是将变量引用,使得形参a,b等价于实际变量,从而达到改变变量的效果。这两者的效果是完全相同的。这一点,在后面我肯定不会细讲,因为其实我自己也没有弄的太明白,但是在函数的运用,特别是类的成员函数部分,是非常非常重要的。④联合、枚举、结构这其实是三个部分,但是这三个部分都很简单就放一起好了。联合,是将几个不同的变量,地址放在一起。这点和结构是有区别的,联合中的几个变量实际上是没有关系的,只是单纯地放在一起的几个变量而已。联合用union表示,操作和结构非常像。结构,和C的结构是一样的,通过struct将几个有关的变量放在一起组合成一个新的整体变量。枚举,通过enum来声明一种新的可列变量类型。比如,enum选项{A,B,C,D},这样就有了一个新的变量类型选项,我们可以通过枚举来使一些有限类型变量显得更直观,比如星期几,比如月份。特别说明,没有初值的情况下,enum内的数会自动等价于0,1,2,3……,虽然不能直接给他们赋值或者转化成数字,但是可以通过强制转化变成数字类型。这里我说的很不详细,因为这些都没有什么用。在C++的核心,强大的类类型下,联合和结构只是纯粹为了让C的程序可以直接被C++引用而存在。⑤类类型class类类型,乍一看和结构完全一样。然而类其实是结构的一个超集。类不光可以实现结构的所有功能,还有许多结构所没有的特点。类可以作为头文件使用,使得我们可以使用很多现成的或者被共享的类,来实现需要的功能。这一点让C++模块化的形式显得十分鲜明。类具有封装性,可以通过一些机制实现内部成员的保护。不能被外部随意的调用和修改。具有继承性,可以通过继承来直接使用旧有类中有用的函数或者变量。类具有多态性,可以实现一条指令,多种实现。这些具体的都要放在后面讲。这里只讲一下类的基本特性和结构。类的定义方式和结构非常相似,同样是类成员定义。然而与结构最大的不同是,类有成员函数,结构函数和析构函数。并且类可以执行操作符重载。定义一个基本的类:classComplex{Private:DoubleRe;DoubleIm;Public:Complex(intRe=0,i