C++入门
《完美C++》第5版 (美)Walter Savitch,Kenrick Mock 萨维奇//默克 著 薛正华,沈庚,韦远科 译 出版社: 电子工业出版社
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
时间2019/4/11-5/14?待定一个月
第一章 C++基础
分析机不是什么问题都能解决,它只能根据我们告诉它的方式完成事情。它可以遵循我们给出的分析,但没有能力对新的分析关系或事实预测。归根到底,它只是帮助我们去做一些我们已经知道的事情。——奥古斯塔.艾达.洛夫莱斯
1.1 C++简介 总结:
语言是科学唯一的工具。——塞缪尔.约翰逊
1.C++内存管理机制:C++内存管理和C语言类似,程序员自己负责内存的申请和释放。
注意:由于C语言是C++的一个子集,因此大多数编译器允许C++程序采用C风格的内存管理方式。但是,C++有自己风格的内存管理方式,并且在编写C++程序的时候,建议采用C++风格的内存管理方式。
2.所有过程式的实体都被成为函数。其他语言中的过程、方法、函数和子程序,在C++中都被统称为函数。
注意:程序执行时,运行时会自动调用main函数。
3.int main()表明main是一个无参数、返回值为int的函数。
注意:有些编译器允许省略上面的int或用void替代,表明该函数没有返回值。但是上面的方式是C++程序中开始main函数最规范形式。
4.return 0;这个代码的执行标志着程序运行的终止。在main函数中结束main函数的运行,并设置函数的返回值为0。
注意:根据ANSI/ISO C++标准,该语句不是必需的,但是目前许多编译器要求该语句。
5.cout << "How many programming languages have you used?"; //输出引号的文本到屏幕。
cin >> numberOfLanguages;//要求用户输入一个数字,并将其存入变量numberOfLanguages中。
注意:引号部分的内容被称为字符串,或者更确切地说,C风格的字符串。
1.2 变量、表达式及赋值语句 总结:
一个人一旦理解了编程中变量的使用方式,那么他也就掌握了编程的精髓。——艾兹格.迪科斯彻,《结构化编程注解》
1.变量以及其他在程序中定义的项目的名字被称为标识符。
注意:1)C++中的标识符必须以字母或下划线开始,其余部分包括字母、数字或者下划线。虽然以下划线开头的标识符是合法的,但是不建议这么做,因为一般来讲,以下划线开头的标识符约定为系统或者标准函数库中的标识符。
2)C++区分大小写,因此 rate,RATE,Rate为三个不同的标识符。但是为了避免混淆,不建议在将其用在同一个程序中。
3)另外,作为约定,变量的首字母要求小写。预定义标识符,如main,cin,cout等,必须全为小写。针对面向对象编程,约定采用大小写混合的方式,变量首字母小写,词界采用大写字母标识。如:topSpeed,timeOfArrival
4)C++中标识符没有长度的限制,但是具体的编译器会忽略一定长度之后的所有字符。
2.有一些特殊的标识符叫关键字或者保留字。这些标识符预先在C++中定义,有特殊的用途,不能用作变量名或其他用途。
注意:一些预先定义的标识符,如cin和cout都不是关键字。它们不是C++语言核心,可以对它们进行重定义。虽然这些预先定义的标识符不是关键字,但是却在C++的标准库中进行了定义。若用作一般用途,会导致很多问题,应尽量避免。最安全和方便的做法是将所有预定义的标识符都当作关键字。
3.
注意:
1.3 控制台输入/输出 总结:
进来是垃圾,出去也是垃圾。——一句谚语
1.
注意:
2.
注意:
3.
注意:
1.4 编程风格 总结:
在非常重要的事情上,最要紧的并非真诚,而是格调。——奥斯卡.王尔德,《不可儿戏》
1.
注意:
2.
注意:
3.
注意:
1.5 库与命名空间 总结:
1.
注意:
2.
注意:
3.
注意:
第二章 流程控制
“您能告诉我,从现在开始我该往哪个方向走吗?”“这很大程度上取决于你想得到怎样的结果。”猫说。——刘易斯.卡罗尔,《爱丽丝漫游仙境》
2.1 布尔表达式 总结:
要想区分真伪,首先必须知道什么是真,什么是伪。——贝尼迪.斯宾诺沙,《伦理学》
1.
注意:
2.
注意:
3.
注意:
2.2 分支机制 总结:
如果你遇到一个好的机遇,就请牢牢抓住。——尤吉.贝拉
1.
注意:
2.
注意:
3.
注意:
2.3 循环 总结:
有些任务与其说是家务劳动,不如说是科林斯王的折磨,其无休止地重复:一遍又一遍,一天又一天。——西蒙娜.德.波伏娃
1.
注意:
2.
注意:
3.
注意:
2.4 文件输入简介 总结:
你会在美丽的四开纸上看到那些文字,整齐的文字宛如那小溪蜿蜒穿过草地的边缘。——理查德.布林斯莱.谢立丹,《造谣学校》
1.
注意:
2.
注意:
3.
注意:
第三章 函数基础
幸福来自点滴的积累。——一句俗语
3.1预定义函数 总结:
不要重新发明轮子。——一句俗语
1.函数库的使用:1)在程序中用include指令引入该函数库 2)采用using指令包含std命名空间
注意:所有预定义的函数均要求使用include指令和using std指令,使用预定义函数要注意其实参类型,返回类型及头文件
但是,某些系统下的函数库,为了程序的正常编译和运行,还需设定相关编译选项和链接选项。具体的细节随系统的不同而不同;遇到上述问题,请查阅相关操作手册或请教专业人士寻求帮助。
2.相关的函数库:1)输入cin输出cout ->iostream,
2)sqrt(开根号)函数,pow指数(乘方)运算,fabs(double类型的绝对值),ceil向上取整,floor向下取整-> cmath,
3)绝对值函数abs(int类型的绝对值)和labs(long类型的绝对值) ,exit(结束程序),rand(随机数),srand(设置随机数因子)-> cstdlib
注意:1)有三个求绝对值的函数,fabs(double类型的绝对值)-> cmath,绝对值函数abs(int类型的绝对值)和labs(long类型的绝对值) -> cstdlib
2)pow(3.0,2.0) -> 9.0,pow返回值为double类型,且需要两个参数,第一个参数为负,第二个参数就必须为整数。为安全起见,建议使用pow时,确保第一个参数为正
3)自动类型转换,结果不一定是我们想要的,但有一个例外,int类型向double类型转换是自动的
3.exit函数调用将立即结束程序的执行。
注意:exit包含一个int类型的参数,这个参数被传递给操作系统。就C++本身而言,可以使用任何int数值作为参数。但习惯上,由于错误造成的exit调用使用参数1,其他情况则使用参数0
4.随机数生成器。rand()->没有参数,返回值返回一个位于0和RAND_MAX之间的整数,包括0和RAND_MAX。RAND_MAX是一个预定义的整数常量,定义在cstdlib库中,具体的值与系统有关,当一般最小为32767。
注意:比例缩放,如果输出的10个随机数为0~10之间:rand( ) % 11
5.伪随机数:随机数生成器(如函数rand)并不产生真的随机数。函数rand的一系列调用,将产生一系列看似随机的数字。如果使计算机回到调用开始时的状态,重新调用一遍的话,就可以得到一系列相同的“随机数”
1)伪随机数的产生通常由一个被称为种子的数决定,如果以同一个seed启动随机数生成器,不管调用多少次,得到的都是相同的一组数。可以通过srand函数来设定rand的seed。
注意:给定一个seed之后产生的一系列伪随机数是随系统的不同而不同的,同一个系统使用相同的seed总是相同的。
2)函数rand没有参数,srand有一个参数,类型为unsigned int,即必须为非负整数
3)产生一个位于0.0~1.0之间的伪随机浮点数:(RAND_MAX -rand())/static_cast<double>(RAND_MAX)
3.2 自定义函数 总结:
定制西装总是比成衣更适合自己。——我的叔叔,裁缝师
1.自定义函数的实现分为两部分:1)函数声明(又称函数原型) 如:double totalCost(int numberParameter, double priceParameter); //第一个double指明了函数返回值的类型,totalCost为函数的名字,函数totalCost有两个参数:第一个为int类型,第二个为double类型。标识符numberParameter和priceParameter成为形参,或简称参数,形参可以是任何合法的标识符。
2)函数调用 如:bill = totalCost(number, price); //number和price为实参
注意:1)函数声明以分号结束;且函数声明必须先于函数调用,一般放在main函数之前。
2)函数调用以分号结束,这告诉编译器这是一条可执行的语句。
3)函数调用之前必须首先给出该函数的完整定义或者对该函数的声明。最常见的安排是在main部分之前进行相关的声明,而函数的定义则出现在另外的文件中。
4)即使函数没有参数,函数声明和函数调用中也要记得加上括号。
2.函数定义由函数头和函数体组成,函数定义描述了函数如何计算出返回值。
注意:1)函数体可以包含任何合法的C++语句,并在函数调用时执行。因此带有返回值的函数除了返回一个值之外,还可以完成其他操作。但一般来讲,调用带返回值的函数的主要目的是获得返回值。
2)函数体可以包含对另一个函数的调用。可以在函数定义中包含其他函数调用,但不能在一个函数定义中包含另一个函数定义。
3.return语句由关键字return和一个表达式组成。如:return (subtotal + subtotal * TAXRATE);
注意:1)括号可以省略,为了统一起见,建议为了易于阅读,加上。
2)return语句后边没有任何语句,但如果有,这些语句不会被执行。return语句的执行标志着函数调用的结束。
3)return语句以“;”结束
4)函数的返回值可以是bool类型,调用这样的函数会得到一个true或false, 如:return (((rate >= 10) && (rate < 20) ) || (rate ==0)));
5)如果想终止函数执行,可以用return;
4.函数声明的另一种形式:如:double totalCost(int numberParameter, double priceParameter);和double totalCost(int, double);等价
注意:1)通常使用第一种,因为这样可以对函数做详细的解释,如给出每个形参的描述信息。第二种多见于编程手册中。
2)这种形式仅限于函数声明,函数定义必须给出相关的形参名字。
5.陷阱:参数顺序的错误
虽然计算机会检测每个实参的类型,但并不会检查其合理性。如果实参的顺序弄混,计算机不会按你希望的那样运行。如果类型不匹配且不能进行相关的类型转换,计算机将报错。
6.示例:一个四舍五入的函数
说明:预定义函数没有包括对一个数的四舍五入的函数。函数ceil和floor有类似的功能,但不是四舍五入的函数。
函数ceil返回邻近的最大整数, 如:ceil(2.1) ->3.0而不是2.0。函数floor返回邻近的小于或等于实参的整数。如:floor(2.1) ->2.0而不是3.0
思路:使用floor函数,将原数值加0.5后进行判断,如2.4四舍五入2,floor(2.4+0.5)->2.0->再转换为int:2,2.6四舍五入3,floor(2.6+0.5)->3.0->再转换为int:3
实现:
int round(double number){
return static_cast<int>(floor(number + 0.5));
}
7.void函数的定义与带返回值的函数仅有两点区别:1)在函数返回值类型的地方用void代替,这告诉编译器这个函数没有返回值;
2)void函数的函数体中没有return语句。函数体中的最后一条语句的执行代表着函数的结束。
注意:虽然void函数的结尾不需要添加return语句,但这并不代表void函数不需要return语句,有时候return语句还是必不可少的。如P99酒店管理程序,当就餐客人数为0时,if语句后的return将结束函数的执行,避免除数为0的情况。
8.编写函数注释的好办法是将其分为两部分:前提条件(precondition)和运行结果(postcondition)
如:void showInternet(double balance, double rate);
//前提条件:balance是非负的存款余额。
//rate是以百分数表示的利率,如5代表5%。
//运行结果:屏幕上输出相应的利息数。
注意:precondition和postcondition可以省略,但在设计函数及编写函数声明的注释的时候,应该按照precondition和postcondition这种方式进行考虑。
9.main函数中的return 语句可有可无?
虽然C++标准规定可以省略程序中main部分的return 0语句,但很多编译器都要求必须包含return 0,并且几乎所有的编译器都允许其存在。考虑到程序的可移植性,编写程序时应该总是在main部分中包含return 0语句。可以将程序的main部分看作是一个返回值为int的函数,因此需要包含一个return语句。将程序的main部分看作是一个返回整数的函数,这似乎不好理解,但很多编译器都这么处理。
注意:1)虽然有些编译器允许,但在你的代码中不应该对main函数进行调用。只有系统才能调用main函数,也就是在程序运行的时候。
2)C++允许定义递归函数,但是main函数不能被递归调用。
第四章 重载与默认实参
4.1
总结:
1.
注意:
2.
注意:
3.
注意:
