1、C+的特点:1.支持抽象数据类型 2.多态性,一个接口,多重算法,支持初期联编和滞后联编3.继承性,保证了代码复用,支持分类的概念一个c+程序由一个或多个函数构成,并且在这些函数中只有一个主函数main,它是程序执行的入口。C+程序严格区别字母的大小写。C+程序中的字符:(字符单位:0x00-0x7f范围内定义的ASC|码所表达的西文字符,每个ASC|码字符占用1个字节)1. 标记符:标准c+标记符由字母、下划线和数字组成,且第一个字符不能为数字,长度一般不超过32个,文献只辨认前8个字符。标记符大小写敏感。自定义标记符不提倡以下划线开始。2. 关键字:又称保存字,具有特定含义。C+的基本数据
2、类型:C+的数据类型分为两大类:基本数据类型和导出数据类型。基本数据类型:字符型(char)、整型(int)、单精度实型(float)、双精度实型(double)、布尔型(bool)和空类型(void)。Float可以保存7位有效数字,double可以保存15位有效数字。导出数据类型:数组、指针、引用、结构体、共用体、枚举和类。逻辑型也称布尔型,用来解决逻辑量。取值只有true(真)和false(假)两个,占1个字节,将非0值解释为真,将0值解释为假。变量与常量:(C+中有字符串常量,没有字符串变量。)变量三要素:变量名、变量的内存空间和变量的值。定义格式:数据类型 变量名变量必须先定义后使用
3、,变量拟定类型后,编译器可以对变量参与的运算做合法性检查。变量赋值:1:变量定义后,用赋值语句赋初值。2:在定义变量时直接对变量赋初值,称为变量的初始化。注意:不能对文字常量赋值,不能对表达式赋值,常量不能重新赋值。文字常量:整型、实型、字符型、字符串型。(存储在代码区,不是通过地址进行访问。)实型常量在内存中以浮点形式存在。符号常量:(const)符号常量在使用前一定要一方面声明。形式为:const 数据类型说明符 常量名=常量值;符号常量在声明时一定要赋初值,而在程序中间不能改变其值。运算符和表达式:算数运算符:对于除运算符,当两个运算量均为整数时为整除,商取整数,当至少有一个运算量为实数
4、时,则为普通除。 对于求余运算,规定运算量必须为整型数据。注意:计算时注意溢出问题!自增、自减运算符:i+表达先用i的值参与运算,然后再将变量i的值加1.+i表达先将变量i的值加1,然后再参与其他运算。自增、自减运算符只能作用于变量,不能用于其他。关系运算符(、=、=、!=):关系运算符的优先级比算数运算符的优先级低,但比赋值运算符的优先级高 。参与关系运算的两个操作数可以是任意类型的数据。当比较结果成立时,结果为true;当比较结果不成立时,结果为false.逻辑运算符(!、&、|):非运算符(!)的优先级比算数、关系运算符的优先级高。与运算符(&)和或运算符(|)的优先级比算数关系运算符的
5、优先级低,但比赋值运算符级高。&和|运算符具有短路的特性:对于&,运营时先对第一个操作数求值,假如其值为false,则不再对第二个操作数求值;对于|,运营时先对第一个操作数求值,假如其值为true,则不再对第二个操作数求值。注意:1.在判断运算量的真假时,c+规定任何非0值表达true,0值表达false. 2.C+在计算逻辑表达式时,从左向右扫描表达式,一旦能拟定表达式的值,就不继续进行计算。 位运算符:对整型数据的运算(二进制),符号位也参与运算。 1按位与(&):相应位都是1,则结果为1,否则为0. 2按位或(|):一个数的相应位为1,则结果为1;若两个数的相应位都是0,结果是0. 3按
6、位异或():相应位不同结果为1,否则为0. 4按位取反():0变1,1变0. 5左移(): 将a按二进制位向右移动n位,移出的最低n位舍去,最高位补0或1,这取决于a是什么类型的整型量,若有符号则高位补符号位,若无符号,则高位补0.对一个量进行右移一个二进制位操作,相称于除以2操作。右移n个二进制位,相称于除以2n操作。逗号运算符(,):所有运算符中级别最低的一个。一般形式:表达式1,表达式2,表达式3,逗号表达式的求解过程是从左至右依次计算各表达式,并将最后一个表达式的值作为整个逗号表达式的值。运算符优先级口诀:括号箭头点(,(),-,.1级) 否认取反加加负减减(!,+,-,- -2级)
7、间访地址转型分派回收测空间(*,&,(类型),newdeleted,sizeof 2级) 先乘除后加减(*,/,%3级+,-4级) 先移位后比较再看等不等(5级、=6级=、!=7级) 位与位异或位或(&8级9级|10级) 与或三元件(&11级 |12级 ?;13级) 赋值接逗点(=、+=、-=、*=、/=、%=、&=、=、|=、=14级,15级)结合性口诀:从右到左2、14(级别),其他都是左到右。数制转换:1. 其他进制转化成十进制数:乘幂展开2. 十进制数转化成其他进制数:除基取与倒排序(整数部分);小数连续乘以基取整,直到最后的乘积是整数为止。3. 二进制转化成八进制(以数字0开头):从
8、小数点向左,每三位二进制转换成一位八进制数局限性补0。4. 二进制转换成十六进制(以0x开头):从小数点向左,每四位二进制转换成一位十六进制数,局限性补0。.二进制数的编码表达:1. 原码:符号-绝对值表达(最高位符号位:1为负数,0为正数)2. 反码:正数的反码和原码相同;负数的反码的符号位与原码相同(仍用1表达),其余各位安位取反。3. 补码:对于一个负数,其补码由该数反码的末位加1求得;对于正数,其原码,反码,补码形式相同。(补码的符号位可以作为数值参与运算,补码运算的结果仍为补码。)语句:1.表达语句 2.空语句(只有一个分号构成的语句,空语句不执行任何操作但有语法意义) 3.复合语句
9、(对于单个语句,必须以“;”结束;对于复合语句,其中的每个语句仍是以“;”结束,而整个符复合语句的结束符是“”) 4.流程控制语句类型转换:1. 赋值时的类型转换:A:实型数据赋给整型变量:实型数据赋给整型变量时,舍弃小数部分,将整数部分赋给整型变量,不进行四舍五入。 B:整数赋给实型变量:整数赋给实型变量,数值不变,有效数字位数增长。 C:整型数据之间互相赋值:1.)“长的”整型量赋给“短的”整型量,将“长的”整型量“的高位去掉,截取其与“短的”整型量相同位数的低位,然后进行赋值;2.)“短的”整型量赋给“长的”整型量a.将短的无符号整型量赋给长的整型变量,方法是在短的无符号整型量前补0,使
10、其长度达成长的整型量的位数;b.将短的有符号整型量赋给长的整型变量要做符号位的扩展,即在短的整型量前补符号位。2. 混合运算时的类型转换:由低类型向高类型转换。3. 强制类型转换:格式()表达式 强制转换的是表达式的 值。简朴的输入和输出方法Cout对象和cin对象Cout对象只能用来输出数据,cout是输出流中的一个对象,因此也称为流对象“是流插入操作符,使用”“可以传送多个数据给cout。注意:程序使用cout对象和cin对象,必须在程序开头包含如下两行:#includeUsing namespace std;有两种换行的方法:一种是在cout语句后加一个流操作符endl;另一种方法是加入
11、n换行符。“”是流提取操作符插入操作符“”指定了数据的流动方向。插入操作符将 输入的数据传给变量,而提取操作符将变量(或常量)传给cout输出。Cin对象在读取数据时,将暂停程序的运营,直到从键盘上输入数据并按enter键确认。Cin对象能自动地将输入数据转换成与变量一致的数据类型。采用cin对象可以一次读入多个变量的值。当输入多个数时,数值之间要加空格。采用一个cin,也可以同时为多个不同类型的变量读入数据。Cin读入的字符串也是采用字符数组存储。假如用一个字符数组存储字符串,要保证该字符数组足够大,可以存储字符串中的所有字符,涉及“0”。格式化输出1. setw操作符为每一个输出数据项指定
12、宽度。例如:cout setw(5)只读取输入中的第一个非空白字符。Cin.ignore()括号里有参数(n,c)其中n是一个整数,表达跳过的字符数,c表达碰到字符c时停止跳跃;括号里没有参数,表达跳过键盘缓冲区中的第一个字符。Typedef声明: Typedef就是用于将一个标记符声明成某个数据类型的别名,然后将这个标记符当作数据类型使用。 形式:typedef 已有类型名 新类型名表; 其中,新类型名表中可以有多个标记符,他们之间可以用逗号隔开。枚举: 格式:enum 枚举类型名 枚举常量列表; 对于枚举元素按常量解决,不能对其赋值,枚举常量的值可以在定义时被显式指定,后一个总比前一个的值
13、加1.枚举值可以进行关系运算。整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应进行强制类型转换。函数: 声明函数时,形参表只要包含完整的类型信息即可,形参名可以省略。函数参数的传递方式:C+支持两种参数传递方式:值传递和引用传递。值传递是指当发生函数调用时,给形参分派内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参怎么改变,都不会影响实参。引用传递是一种特殊类型 的变量,可以被认为是另一个变量的别名,通过引用名与通过被引用的变量名访问变量的效果是同样的。注意:声明一个引用时,必须同时对它进行初始化,
14、使它指向一个已存在的对象,一旦一个引用被初始化后,就不能改为指向其他对象。引用可以作为形参,成为引用传递。内联函数在编译时将函数体潜入在每个调用处。内联函数应当是比较简朴的函数,结构简朴,语句少。形式:inline 类型说明符 函数名(含类型说明的形参表) 语句序列默认参数: C+允许定义具有默认实参的函数。这样在函数调用时,实参与形参的个数不同,默认参数也称为缺省参数。假如在函数调用中省略了函数实参,将把函数的缺省值赋给函数形参。缺省值的设定通常是在函数原型中给出。假如在程序中没有给出函数原型,那么缺省值可以在定义函数时给出。函数的缺省值应当在函数名出现最早的地方给出。 注意:在函数调用中,
15、第一个参数用缺省值,而第二个参数用指定值是错误的,假如一个参数具有缺省值,那么它右边的参数都要有缺省值。形参不一定都要有缺省值。参数的缺省值必须是常量,不能是变量。函数的返回值:注意:1.)一个函数可以有多个参数,但一个函数最多只能返回一个值,假如要从一个函数返回多个值,必须通过“打包”的方式,将这些值当作一个整体来解决。2.)假如一个函数的返回值不是void,那么该函数必须包含return语句。函数递归调用:对同一个函数的多次不同调用中,编译器会为函数的形参和局部变量分派不同的空间,他们互不影响。函数重载:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类
16、型及个数的最佳匹配,自动拟定用哪个函数,这就是函数重载。重载函数的形参必须不同:个数不同或类型不同。编译器不以形参名和返回值来区分函数。不要将不同功能的函数定义为重载函数。局部变量和全局变量:内存存储区的分布:1.)代码区:存放程序的可执行代码。 2.)全局数据区:存储静态变量和一般的全局变量,自动初始化为0。 3.)栈区(一种先进后出的结构):存放局部变量 ,涉及函数的形参、函数内定义的一般变量。分派栈区时,不解决原内存中的值。假如对变量不初始化,那么变量的初值不拟定。 4.)自由存储的堆区:存放与指针有关的动态数据,分派存储区时,也不清零。局部变量:局部变量涉及函数的形参、函数内定义的变量
17、、复合语句内定义的变量。由于局部变量具有一定的范围性,所以不同的函数可以定义同名的变量,但这些变量之间不会互相影响。全局变量:全局变量存放在全局数据区,假如定义时没有给出初值,则自动初始化为0.全局变量可定义在函数外的任何一个位置,其有效范围是从变量定义处开始到文献结束,都可以访问。假如程序的某个函数修改了全局变量,则其他函数都可见修改后的结果。假如一个函数内的局部变量和全局变量同名,那么对于函数来说只有局部变量是可见的,这称为全局变量的隐藏。要引用同名的被隐藏的全局变量,必须加上“:” 局部变量与栈:当函数调用时,系统借助栈实现函数调用和局部变量的空间分派。变量的存储类别:auto(自动存储
18、变量);register(寄存器变量)采用register修饰的变量将尽也许的存储在寄存器中,以提高程序的运营速度;register只能修饰局部的int型或char型变量,而不能修饰其他类型的变量;static(静态变量)初始化仅进行一次;extern扩展全局变量的作用域。将全局变量的作用域扩展到定义之前:在引用之前用关键字extern对该变量进行引用性说明。此声明不同于全局变量的定义,采用extern声明变量,应保证变量已经在其他地方定义过。用extern声明变量时,类型名可以省略。将全局变量的作用域扩展到其他文献:静态全局变量不能采用extern进行作用域扩展。类:定义类的语法形式: 例子
19、:Class 类名称 class clock Public: public:外部接口 void settime(int newH,int newM,int newS);Protected: private:保护型成员 int hour,minute,second;Private: public: 私有成员 void showtime();;/注意分号。 ;注意:在类中可以只声明函数的原型,函数的实现(即函数体)可以在类外定义类的成员涉及数据成员和函数成员。对类成员访问权限的控制属性有:公有属性(public),私有属性(private),保护属性(protected)。公有类型成员定义了类的外
20、部接口,在类外只能访问类的公有成员;私有成员只能被本类的成员函数访问,来自类外部的任何访问都是非法的,假如私有成员紧接着类名称,则关键字private可以省略。一般情况下,一个类的数据成员都应当声明为私有成员。在类的定义中,具有不同访问属性的成员,可以按任意顺序出现。修饰访问属性的关键字也可以多次出现,但是一个成员只能有一种访问属性。在书写时通常习惯将公有类型放在最前面。声明对象:类名 对象名;注意:对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存只可以只占据一份空间访问数据成员:对象名.数据成员名调用函数成员:对象名.函数成员名(参数表)函数的
21、原型声明要写在类体中,具体函数的实现是写在类定义之外的,函数实现具体形式:返回值类型 类名:函数成员名(参数表)函数体成员函数调用中的目的对象:调用一个成员函数需要使用“.”操作符之处调用所针对的对象(myclock.showtime():myclock就是这一调用过程中的目的对象。)。在成员函数中可以不使用“.”而直接引用目的对象中的数据成员。在成员函数中引用其他对象的属性和调用其他对象的方法时,都需要使用“.”注意:在类成员函数中,既可以访问目的对象的私有成员,又可以访问当前类的其他对象的私有成员。带默认形参值的成员函数:类成员函数的默认值一定要写在类定义中,而不能写在类定义之外的函数实现
22、中。内联成员函数的声明:隐式声明和显式声明隐式声明:将函数体直接放在类体内。显式声明:用inline修饰,在函数实现时。构造函数和析构函数: 构造函数的作用就是在对象被创建时运用特定的值构造对象,将对象初始化为一个特定状态,构造函数也是类的一个成员函数,构造函数的函名与类名相同,并且没有返回值。构造函数通常被声明为公有函数。只要类中有构造函数,编译器就会在建立新对象的地方自动插入对构造函数调用的代码。复制构造函数:复制构造函数的特性:其形参是本类的对象的引用。其作用是使用一个已经存在的对象(由复制构造函数的参数指定)。去初始化同类的一个新对象。声明和实现复制构造函数的一般方法:Class 类名
23、Public:类名(形参表);类名(类名&对象名);类名:类名(类名&对象名)函数体复制构造函数被调用的情况:当用类的对象去初始化该类的另一个对象时。假如函数的形参是类的对象,调用函数时,进行形参和实参的结合时。假如函数的返回值是类的对象,函数执行完毕返回调用者时。析构函数: 析构函数是对象在生存期即将结束的时刻被自动调用的,析构函数不接受任何参数。形式:类名() 没有返回值。类的组合:组合类构造函数定义的形式:类名:类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)类的初始化构造函数的调用:(1. )调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的顺序,动态内存分布
24、:运算符 new的功能是动态分派内存,或是动态创建堆对象。语法形式: new 数据类型(初始化参数列表);int*point point=new int2:动态分派了用于存放int数据类型的内存空间,并把2的值存入该空间。int*point=new int:对于基本数据类型,假如不希望在分派内存后设定初值,可以把括号省去。假如保存括号,但括号里不写任何值,则表达用零去初始化该对象。int*point=new int7:申请一个能存放7个数据的数组。运算符delete用来删除new建立的对象,释放指针所指向的内存空间。格式:delete 指针名;假如被删除的是对象,该对象的析构函数将被调用,对于
25、用new建立的对象,只能用delete进行一次删除操作。用new申请的空间必须用delete加以释放。函数模板Template 例:template类型名 函数名(参数表) T abs(T i)函数体的定义 return i0?i:-i函数模板不会进行自动类型转换。作用域:1. 函数原型作用域:在函数原型声明时形式参数的作用范围就是函数原型的作用范围。在函数原型的形参类表中起作用的只是形参的数据类型,标记符并不起作用。2.局部作用域:函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束时为止。函数体内声明的变量,其作用域从声明出开始,一直到声明所在的块的大括号为止。3. 类的
26、作用域:对类的成员m的访问方式:(1.)假如在X的函数成员函数中没有声明同名的局部作用域标记符,那么该函数内可以直接访问成员m.(2.)通过表达式X.m或者X:m。X:m是对类的静态成员的访问。(3.)通过ptr-m这样的表达式,其中ptr是指向类的对象的指针。4.命名空间的作用域:语法形式: namespace 命名空间名 命名空间内的各种声明(函数声明,类声明)引用其他命名空间的标记符:命名空间名:标记符名假如需要引用类名或函数名,如下:someNs(命名空间名):someClass(类名) Obj1(对象)Using语句:Using命名空间名:标记符名;Usingnamespace 命名
27、空间;命名空间也允许嵌套。匿名命名空间: namespace匿名命名空间内的各种声明具有局部作用域的变量把具有命名空间作用域的变量隐藏了,具有命名空间作用域的变量变得不可见。具有命名空间作用域的变量也称全局变量。 5.作用域可见性的一般规则:(1. )标记符要声明在前,引用在后。(2. )在同一作用域中,不能声明同名的标记符。(3. )在没有互相包含关系的不同的作用域中声明同名标记符,互不影响。(4. )假如在两个或者多个具有包含关系的作用域中声明了同名标记符,外层标记符内层不可见。对象的生存期:1. 静态生存期: 假如对象的生存期与程序的运营期相同,则称它具有静态生存期。在命名空间作用域中声
28、明的对象都具有静态生存期。假如在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static。 在定义静态变量的同时可认为它赋初值。类的数据成员也可以用static修饰。 定义时未指定初值的基本类型静态生存变量,会被赋予0初始化。2. 动态生存期:局部生存期对象诞生于声明点,结束于声明所在的块完毕时。 类的成员对象也有各自的生存期。不用static修饰的成员对象,其生存期都与它们所属对象的生存期保持一致。 类的静态成员:静态成员是解决同一个类的不同对象之间数据函数共享问静态数据成员:类的静态数据成员需要在类定义之外再加以定义,由于需要以这种方式专门为它们分派空间。在对类的静态私有
29、数据成员初始化的同时,还可以引用类的其他私有成员,例如:假如一个类T存在类型为T的静态私有对象,那么可以引用该类的私有构造函数将其初始化。静态函数成员:静态成员函数可以通过类名或对象名来调用。静态成员函数可以直接访问该类的静态数据和函数成员。在静态函数成员中访问类的非静态成员需要指明对象。类的友元:友元函数:在类中用friend修饰的非成员函数。在类内用friend修饰加以声明,在类外以普通函数的形式实现,不加friend。友元类:若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。友元关系是不能传递的,是单向的,是不被继承的。共享数据的保护:常对象:
30、常对象必须进行初始化,并且不能被更新:const 类型说明符 对象名;注:在声明对象时,把const放在类型名后也是可以的。在定义一个变量或常量时为它指定初始值叫做初始化,而在定义一个变量或常量以后使用赋值运算符改变他的值叫做赋值。常成员函数:类型说明符 函数名(参数表) const;注意:const是函数类型的一个组成部分,因此在函数的定义部分也要带cons关键字。 假如将一个对象说明为常对象,则通过该对象只能调用他的常成员函数,而不能调用其他成员函数。 无论是否通过常对象调用常成员函数,在长成员函数调用期间,目的对象都被视为常对象。 const关键字可以用于对重载函数的区分:假如仅以const关键字为区分对成员函数的重载,那么通过非const的对象调用该函数,两个重载函数都可以与之匹配,这时编译器将选择最近的重载函数不带const关键字的函数。常数据成员:细节:类成员中的静态变量和常量都应当在类外定义。类的静态常量假如具有整型类型或枚举类型,那么可以直接在类定义中为它指定常量值。常引用:const 类型说明符 &引用名;常引用做形参,保护的是实际参数。一个常引用,无论是绑定到一个普通的对象,还是常对象,通过该引用访问该对象时,都只能把该对象当作常对象。对于类类型的引用,则不能修改它的数据成员。对象数组:形式:类名 数组名常量表达式;访问形式:数组名下标表达式.成员名