c++知识点Word文件下载.docx
《c++知识点Word文件下载.docx》由会员分享,可在线阅读,更多相关《c++知识点Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
运算符和表达式:
算数运算符:
对于除运算符,当两个运算量均为整数时为整除,商取整数,当至少有一个运算量为实数时,则为普通除。
对于求余运算,要求运算量必须为整型数据。
计算时注意溢出问题!
!
自增、自减运算符:
i++表示先用i的值参加运算,然后再将变量i的值加1.
++i表示先将变量i的值加1,然后再参加其他运算。
自增、自减运算符只能作用于变量,不能用于其他。
关系运算符(<
、<
=、>
、>
=、==、!
=):
关系运算符的优先级比算数运算符的优先级低,但比赋值运算符的优先级
高。
参加关系运算的两个操作数可以是任意类型的数据。
当比较结果成立时,结
果为true;
当比较结果不成立时,结果为false.
逻辑运算符(!
、&
&
、||):
非运算符(!
)的优先级比算数、关系运算符的优先级高。
与运算符(&
和或运算符(||)的优先级比算数关系运算符的优先级低,但比赋值运算符
级高。
和||运算符具有短路的特性:
对于&
,运行时先对第一个操作数求值,
如果其值为false,则不再对第二个操作数求值;
对于||,运行时先对第一个
操作数求值,如果其值为true,则不再对第二个操作数求值。
1.在判断运算量的真假时,c++规定任何非0值表示true,0值表示
false.
2.C++在计算逻辑表达式时,从左向右扫描表达式,一旦能确定表达式的值,就不继续进行计算。
位运算符:
对整型数据的运算(二进制),符号位也参与运算。
1.按位与(&
):
对应位都是1,则结果为1,否则为0.
2.按位或(|):
一个数的对应位为1,则结果为1;
若两个数的对应位都是0,结果是0.
3.按位异或(^):
对应位不同结果为1,否则为0.
4.按位取反(~):
0变1,1变0.
5.左移(<
<
将a按二进制位向左移动n位,移出的最高n位舍去,最
低位补n个0.对一个量进行左移一个二进制位操作,相当
于乘以2操作。
左移n个二进制位,相当于乘以2^n操作
程序运算时,左移运算比乘法操作速度要快。
6.右移(>
>
):
将a按二进制位向右移动n位,移出的最低n位舍去,最
高位补0或1,这取决于a是什么类型的整型量,若有符号
则高位补符号位,若无符号,则高位补0.对一个量进行右
移一个二进制位操作,相当于除以2操作。
右移n个二进
制位,相当于除以2^n操作。
逗号运算符(,):
所有运算符中级别最低的一个。
一般形式:
表达式1,表达式2,表达式3,……
逗号表达式的求解过程是从左至右依次计算各表达式,并将最后一个表达式的值作为整个逗号表达式的值。
运算符优先级口诀:
括号箭头点([],(),->
.1级)
否定取反加加负减减(!
,~,++,-,--2级)
间访地址转型分配回收测空间(*,&
,(类型),new
deleted,sizeof2级)
先乘除后加减(*,/,%3级+,-4级)
先移位后比较再看等不等(<
5级<
=6级==、!
=7级)
位与位异或位或(&
8级^9级|10级)
与或三元件(&
11级||12级?
;
13级)
赋值接逗点(=、+=、-=、*=、/=、%=、&
=、^=、|=、<
=14级,,15级)
结合性口诀:
从右到左2、14(级别),其他都是左到右。
数制转换:
1.其他进制转化成十进制数:
乘幂展开
2.十进制数转化成其他进制数:
除基取与倒排序(整数部分);
小数连续乘以基取整,直到最后的乘积是整数为止。
3.二进制转化成八进制(以数字0开头):
从小数点向左,每三位二进制转换成一位八进制数不足补0。
4.二进制转换成十六进制(以0x开头):
从小数点向左,每四位二进制转换成一位十六进制数,不足补0。
.
二进制数的编码表示:
1.原码:
符号-绝对值表示(最高位符号位:
1为负数,0为正数)
2.反码:
正数的反码和原码相同;
负数的反码的符号位与原码相同(仍用1表示),其余各位安位取反。
3.补码:
对于一个负数,其补码由该数反码的末位加1求得;
对于正数,其原码,反码,补码形式相同。
(补码的符号位可以作为数值参加运算,补码运算的结果仍为补码。
语句:
1.表达语句
2.空语句(只有一个分号构成的语句,空语句不执行任何操作但有语法意义)
3.复合语句(对于单个语句,必须以“;
”结束;
对于复合语句,其中的每个语句仍是以“;
”结束,而整个符复合语句的结束符是“}”)
4.流程控制语句
类型转换:
1.赋值时的类型转换:
A:
实型数据赋给整型变量:
实型数据赋给整型变量时,舍弃小数部分,将整数部分赋给整型变量,不进行四舍五入。
B:
整数赋给实型变量:
整数赋给实型变量,数值不变,有效数字位数增加。
C:
整型数据之间相互赋值:
1.)“长的”整型量
赋给“短的”整型量,将“长的”整型量“的高位去掉,截取其与“短的”整型量相同位数的低位,然后进行赋值;
2.)“短的”整型量赋给“长的”整型量a.将短的无符号整型量赋给长的整型变量,方法是在短的无符号整型量前补0,使其长度达到长的整型量的位数;
b.将短的有符号整型量赋给长的整型变量要做符号位的扩展,即在短的整型量前补符号位。
2.混合运算时的类型转换:
由低类型向高类型转换。
3.强制类型转换:
格式(<
type类型>
)表达式强制转换的是表达式的值。
简单的输入和输出方法
Cout对象和cin对象
Cout对象只能用来输出数据,cout是输出流中的一个对象,因此也称为流对象
“<
“是流插入操作符,使用”<
“可以传送多个数据给cout。
程序使用cout对象和cin对象,必须在程序开头包含如下两行:
#include<
iostream>
Usingnamespacestd;
有两种换行的方法:
一种是在cout语句后加一个流操作符endl;
另一种方法是加入‘\n’换行符。
“>
”是流提取操作符
插入操作符“<
”和提取操作符“>
”指定了数据的流动方向。
插入操作符将输入的数据传给变量,而提取操作符将变量(或常量)传给cout输出。
Cin对象在读取数据时,将暂停程序的运行,直到从键盘上输入数据并按enter键确认。
Cin对象能自动地将输入数据转换成与变量一致的数据类型。
采用cin对象可以一次读入多个变量的值。
当输入多个数时,数值之间要加空格。
采用一个cin,也可以同时为多个不同类型的变量读入数据。
Cin读入的字符串也是采用字符数组存储。
如果用一个字符数组存储字符串,要确保该字符数组足够大,能够存储字符串中的所有字符,包括“\0”。
格式化输出
1.setw操作符为每一个输出数据项指定宽度。
例如:
cout<
setw(5)<
value;
setw括号里的数值指定了将要输出的数据域宽,即输出数据在屏幕上所占的字符宽度。
Setw虽然有括号,但它并不是函数,而是用于设置输出项宽度的操作符,使用时要包含iomanip头文件。
Setw用于设置与它相邻的下一个输出项的域宽,一旦该项输出完毕,将把后面的域宽恢复到默认值。
如果输出数据宽度大于setw指定的域宽,那么cout将输出完整的值,也就是说cout不会截断数据。
浮点数的域宽包括小数点所占的位置;
数值的输出默认为右对齐,即数据在右边,空格填充在数据的左边;
字符串中的空格也属于有效字符,并且占域宽。
2.setprecision操作符指定浮点数的输出精度,即输出数的有效位数。
如果输出数的精度比操作符setprecision指定的要小,则该指定失效。
精度的设置在它被重新设置之前一直有效。
Cout的函数成员
Cout对象调用函数成员width,设定输出项的域宽:
cout.width(5).和setw效果等同。
Cout.precision
(2)设定浮点数的精度。
这种设定将会保持到重新设定或程序的结束。
Cout.setf()设定状态标志,在setf中采用“|”连接多个状态标志。
Unsetf清楚已经设定的状态标志。
指定输入域宽:
Cin的输入域宽可以使用操作符setw指定,也可以使用cin.width函数成员指定。
(1.)域宽只对与其相邻的下一个输入有效。
(2.)当Cin、遇到空字符时,它将停止读入,空字符包括回车,空格,tab键。
(3.)当cin读取一定的字符以后,多余的字符将留在缓冲区中。
读取一行:
Cin.getline(数组名,字符个数(含空字符))
采用cin.getline读取字符串时,将读取换行符前面的所有字符(包含换行符);
但向数组中存储字符时,并不存储换行符,而是采用‘\0‘填写在最后一个有效字符的后面,从而构成一个字符串。
读取一个字符:
Cin能够自动识别当前读入的数据类型;
cin不读取空格,跳格和回车键。
Cin.get()读取输入中的第一个字符,包括空格,tab键和enter键,>
只读取输入中的第一个非空白字符。
Cin.ignore()括号里有参数(n,c)其中n是一个整数,表示跳过的字符数,c表示遇到字符c时停止跳跃;
括号里没有参数,表示跳过键盘缓冲区中的第一个字符。
Typedef声明:
Typedef就是用于将一个标识符声明成某个数据类型的别名,然后将这个标识符当作数据类型使用。
形式:
typedef已有类型名新类型名表;
其中,新类型名表中可以有多个标识符,他们之间可以用逗号隔开。
枚举:
格式:
enum枚举类型名{枚举常量列表};
对于枚举元素按常量处理,不能对其赋值,枚举常量的值可以在定义时被显式指定,后一个总比前一个的值加1.枚举值可以进行关系运算。
整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应进行强制类型转换。
函数:
声明函数时,形参表只要包含完整的类型信息即可,形参名可以省略。
函数参数的传递方式:
C++支持两种参数传递方式:
值传递和引用传递。
值传递是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。
这一过程是值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参怎么改变,都不会影响实参。
引用传递是一种特殊类型的变量,可以被认为是另一个变量的别名,通过引用名与通过被引用的变量名访问变量的效果是一样的。
声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象,一旦一个引用被初始化后,就不能改为指向其他对象。
引用可以作为形参,成为引用传递。
内联函数
在编译时将函数体潜入在每个调用处。
内联函数应该是比较简单的函数,结构简单,语句少。
形式:
inline类型说明符函数名(含类型说明的形参表)
{语句序列}
默认参数:
C++允许定义具有默认实参的函数。
这样在函数调用时,实参与形参的个数不同,默认参数也称为缺省参数。
如果在函数调用中省略了函数实参,将把函数的缺省值赋给函数形参。
缺省值的设定通常是在函数原型中给出。
如果在程序中没有给出函数原型,那么缺省值可以在定义函数时给出。
函数的缺省值应该在函数名出现最早的地方给出。
注意:
在函数调用中,第一个参数用缺省值,而第二个参数用指定值是错误的,如果一个参数具有缺省值,那么它右边的参数都要有缺省值。
形参不一定都要有缺省值。
参数的缺省值必须是常量,不能是变量。
函数的返回值:
1.)一个函数可以有多个参数,但一个函数最多只能返回一个值,如果要从一个函数返回多个值,必须通过“打包”的方式,将这些值当作一个整体来处理。
2.)如果一个函数的返回值不是void,那么该函数必须包含return语句。
函数递归调用:
对同一个函数的多次不同调用中,编译器会为函数的形参和局部变量分配不同的空间,他们互不影响。
函数重载:
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定用哪个函数,这就是函数重载。
重载函数的形参必须不同:
个数不同或类型不同。
编译器不以形参名和返回值来区分函数。
不要将不同功能的函数定义为重载函数。
局部变量和全局变量:
内存存储区的分布:
1.)代码区:
存放程序的可执行代码。
2.)全局数据区:
存储静态变量和一般的全局变量,自动初始化为0。
3.)栈区(一种先进后出的结构):
存放局部变量,包括函数的形参、函数内定义的一般变量。
分配栈区时,不处理原内存中的值。
如果对变量不初始化,那么变量的初值不确定。
4.)自由存储的堆区:
存放与指针有关的动态数据,分配存储区时,也不清零。
局部变量:
局部变量包括函数的形参、函数内定义的变量、复合语句内定义的变量。
由于局部变量具有一定的范围性,所以不同的函数可以定义同名的变量,但这些变量之间不会相互影响。
全局变量:
全局变量存放在全局数据区,如果定义时没有给出初值,则自动初始化为0.全局变量可定义在函数外的任何一个位置,其有效范围是从变量定义处开始到文件结束,都可以访问。
如果程序的某个函数修改了全局变量,则其他函数都可见修改后的结果。
如果一个函数内的局部变量和全局变量同名,那么对于函数来说只有局部变量是可见的,这称为全局变量的隐藏。
要引用同名的被隐藏的全局变量,必须加上“:
:
”
局部变量与栈:
当函数调用时,系统借助栈实现函数调用和局部变量的空间分配。
变量的存储类别:
auto(自动存储变量);
register(寄存器变量)采用register修饰的变量将尽可能的存储在寄存器中,以提高程序的运行速度;
register只能修饰局部的int型或char型变量,而不能修饰其他类型的变量;
static(静态变量)初始化仅进行一次;
extern扩展全局变量的作用域。
将全局变量的作用域扩展到定义之前:
在引用之前用关键字extern对该变量进行引用性说明。
此声明不同于全局变量的定义,采用extern声明变量,应确保变量已经在其他地方定义过。
用extern声明变量时,类型名可以省略。
将全局变量的作用域扩展到其他文件:
静态全局变量不能采用extern进行作用域扩展。
类:
定义类的语法形式:
例子:
Class类名称classclock
{{
Public:
public:
外部接口voidsettime(intnewH,intnewM,intnewS);
Protected:
private:
保护型成员inthour,minute,second;
Private:
public:
私有成员voidshowtime();
};
//注意分号。
};
在类中可以只声明函数的原型,函数的实现(即函数体)可以在类外定义
类的成员包括数据成员和函数成员。
对类成员访问权限的控制属性有:
公有属性(public),私有属性(private),保护属性(protected)。
公有类型成员定义了类的外部接口,在类外只能访问类的公有成员;
私有成员只能被本类的成员函数访问,来自类外部的任何访问都是非法的,如果私有成员紧接着类名称,则关键字private可以省略。
一般情况下,一个类的数据成员都应该声明为私有成员。
在类的定义中,具有不同访问属性的成员,可以按任意顺序出现。
修饰访问属性的关键字也可以多次出现,但是一个成员只能有一种访问属性。
在书写时通常习惯将公有类型放在最前面。
声明对象:
类名对象名;
对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存只能够只占据一份空间
访问数据成员:
对象名.数据成员名
调用函数成员:
对象名.函数成员名(参数表)
函数的原型声明要写在类体中,具体函数的实现是写在类定义之外的,
函数实现具体形式:
返回值类型类名:
函数成员名(参数表)
{函数体}
成员函数调用中的目的对象:
调用一个成员函数需要使用“.”操作符之处调用所针对的对象(myclock.showtime():
myclock就是这一调用过程中的目的对象。
)。
在成员函数中可以不使用“.”而直接引用目的对象中的数据成员。
在成员函数中引用其他对象的属性和调用其他对象的方法时,都需要使用“.”注意:
在类成员函数中,既可以访问目的对象的私有成员,又可以访问当前类的其他对象的私有成员。
带默认形参值的成员函数:
类成员函数的默认值一定要写在类定义中,而不能写在类定义之外的函数实现中。
内联成员函数的声明:
隐式声明和显式声明
隐式声明:
将函数体直接放在类体内。
显式声明:
用inline修饰,在函数实现时。
构造函数和析构函数:
构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定状态,构造函数也是类的一个成员函数,构造函数的函名与类名相同,而且没有返回值。
构造函数通常被声明为公有函数。
只要类中有构造函数,编译器就会在建立新对象的地方自动插入对构造函数调用的代码。
复制构造函数:
复制构造函数的特性:
其形参是本类的对象的引用。
其作用是使用一个已经存在的对象(由复制构造函数的参数指定)。
去初始化同类的一个新对象。
声明和实现复制构造函数的一般方法:
Class类名
{
Public:
类名(形参表);
类名(类名&
对象名)
……
类名:
复制构造函数被调用的情况:
1.>
当用类的对象去初始化该类的另一个对象时。
2.>
如果函数的形参是类的对象,调用函数时,进行形参和实参的结合时。
3.>
如果函数的返回值是类的对象,函数执行完成返回调用者时。
析构函数:
析构函数是对象在生存期即将结束的时刻被自动调用的,析构函数不接受任何参数。
~类名(){}没有返回值。
类的组合:
组合类构造函数定义的形式:
类名(形参表):
内嵌对象1(形参表),内嵌对象2(形参表)……{类的初始化}
构造函数的调用:
(1.)调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的次序,
动态内存分布:
运算符new的功能是动态分配内存,或是动态创建堆对象。
语法形式:
new数据类型(初始化参数列表);
①int*pointpoint=newint[2]:
动态分配了用于存放int数据类型的内存空间,并把2的值存入该空间。
②int*point=newint:
对于基本数据类型,如果不希望在分配内存后设定初值,可以把括号省去。
如果保留括号,但括号里不写任何值,则表示用零去初始化该对象。
③int*point=newint[7]:
申请一个能存放7个数据的数组。
运算符delete用来删除new建立的对象,释放指针所指向的内存空间。
格式:
delete指针名;
如果被删除的是对象,该对象的析构函数将被调用,对于用new建立的对象,只能用delete进行一次删除操作。
用new申请的空间必须用delete加以释放。
函数模板
Template<
typenameT>
例:
template<
类型名函数名(参数表)Tabs(Ti)
{函数体的定义}{returni>
0?
i:
-i}
函数模板不会进行自动类型转换。
作用域:
1.函数原型作用域:
在函数原型声明时形式参数的作用范围就是函数原型的作用范围。
在函数原型的形参类表中起作用的只是形参的数据类型,标识符并不起作用。
2.局部作用域:
函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束时为止。
函数体内声明的变量,其作用域从声明出开始,一直到声明所在的块的大括号为止。
3.类的作用域:
对类的成员m的访问方式:
(1.)如果在X的函数成员函数中没有声明同名的局部作用域标识符,那么该函数内可以直接访问成员m.
(2.)通过表达式X.m或者X:
:
m。
X:
m是对类的静态成员的访问。
(3.)通过ptr->
m这样的表达式,其中ptr是指向类的对象的指针。
4.命名空间的作用域:
语法形式:
namespace命名空间名
{命名空间内的各种声明(函数声明,类声明……)}
引用其他命名空间的标识符:
命名空间名:
标识符名
如果需要引用类名或函数名,如下:
someNs(命名空间名):
someClass(类名)Obj1(对象)
Using语句:
Using命名空间名:
标识符名;
Usingnamespace命名空间;
命名空间也允许嵌套。
匿名命名空间:
namespace{匿名命名空间内的各种声明}
具有局部作用域的变量把具有命名空间作用域的变量隐藏了,具有命名空间作用域的变量变得不可见。
具有命名空间作用域的变量也称全局变量。
5.作用域可见性的一般规则:
(1.)标识符要声明在前,引用在后。
(2.)在同一作用域中,不能声明同名的标识符。
(3.)在没有互相包含关系的不同的作用域中声明同名标识符,互不影响。
(4.)如果在两个或者多个具有包含关系的作用域中声明了同名标识符,外层标识符内层不可见。
对象的生存期:
1.静态生存期:
如果对象的生存期与程序的运行期相同,则称它具有静态生存期。
在命名空间作用域中声明的对象都具有静态生存期。
如果在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static。
在定义静态变量的同时可以为它赋初值。
类的数据成员也可以用static修饰。
定义时未指定初值的基本类型静态生存变量,会被赋予0初始化。
2.动态生存期:
局部生存期对象诞生于声明点,结束于声明所在的块完