一:
1、 数据的类型
类型 类型标识符 字节数 数值范围
整形 int 4 正负21亿多
无符号整形 unsigned [int] 4 0-42亿
短整型 short [int] 2 正负3万
无符号短整型 unsigned short [int] 2 0-6万多
长整形 long [int] 4 正负21亿
字符型 【signed】char 1 -128-127 (相减ASCII表)
无符号字符型 unsigned char 1 0-255
单精度型 float 4 3.4*10-38
双精度 double 8 10的正负308次幂(同下)
长双精度型 long double 8 10的正负308次幂(数大时会以科学计数法的形式输出)
2、 转义字符:
\n 换行 \t 相当于tab \b 向前移一列
v/ 竖向跳格 \反斜杠符、\’ 单引号字符 \” 双引号字符
3、符号常量: define A 30 这不是语句,不加分号
4、%运算符只能使整形
5、?:运算符 x>y?x:y; 真返回x,假返回y。(ch>=’A’&&ch<=’Z’)?(ch+32):ch;
6、输出的控制:
一:通过iomanip头文件控制
hex以16进制输出,,,,,,,,,oct以8进制输出
setfill()设置填充字符,默认为0;
setprecision(n) 在fixed条件下n代表小数个数,在非fixed条件下n表示有效数字
setw(n) 设置字符宽度
setiosflags(ios::fixed) 固定小数
setiosflags(ios::left/right) 左/右对齐
setiosflags(ios::scientific) 设置浮点数以科学计数法显示,只对浮点数和双精度有效
7、关系运算符,如>=,优先度高于赋值,低于算数
如:c>a+b === c>(a+b) ab<c === a(b<c)
8、switch 和case,注意:case会执行对的句子后的所有句子,故要加break’
switch(a){case 1: ; break;
case2: break; default : break;
8、do{}
while(表达式) ; (注意加分号) while里为真时继续执行。
9、函数:函数不可嵌套定义,各函数之间可以相互调用
10、递归函数
11、内置函数inline,在定义和声明时在最前面加上inline
内部函数(又称静态函数) static int func(int a,int b) ,即在函数定义前加static,他只能被本文件的其他函数调用。
外部函数 extern int func(int a,int b),即在函数定义前加extern,他可供外部文件调用
12、函数重载:参数个数、参数类型、参数顺序(在参数类型不同时有效)至少有一个不同,没有返回类型。
13、函数模板:函数的类型由参数决定,且用模板定义的参数类型必须相同。
14、寄存器变量:直接放在寄存器中(如果变量被多次运用这样可以提高效率),在定义时加register ,如 register int a;
15、如果在main函数后定义全局变量a,b,需要在main中对a,b做声明,如extern int a,b;;;;如果想在一个文件里运用另一个文件的变量,可以extern;(谁用谁声明)
16、
冒泡排序法: 选择排序法:
for(int i=1;i<n;i++) //或者i=0,j<n-i-1; for(int i=0;i<n;i++)
{ {
for(int j=0;j<n-1;j++) for(int j=i+1;j<n;j++)
{ {
if(a[j]>a[j+1]) if(a[i]>a[j])
{ {
int c=a[j]; int c=a[j];
a[j]=a[j+1]; a[j]=a[i];
a[j+1]=c; a[i]=c;
} }
} }
} }
17、二维数组:按行列对二维数组全部元素赋值,也可以全部写在一个大括号里,依次赋值,也可以部分赋值,其他默认初始化为0.
二维数组做参数时,第二维不可以省略
18、字符数组,一次性输入加\0,单个字符输入不加\0,
19、getline, get , put , getchar 的应用
20、reserve逆序函数
21、stract 连接函数,strcpy 复制函数, strcmp 比较函数, strlen 长度函数
22、string, 可以直接+、-、比较大小等。
23、指针,指针做函数参数,,不能通过函数形参改变指针的指向。若想改变,使用指针的指针即可。
24、指向数组的指针,*(p+i)==p[i]a[i]----(pa)
指向二维数组的指针 int(*p)[4],p=a; 必须知道列数才可。也可以用二维指针或指针数组用new开辟空间来一个个赋值;
25、指向函数的指针:函数类型(*变量名)(函数形参表)
such: int(*p)(int a,int b) 运用:p=add; (无取址符,无括号) ,p(a,b);
指向成员函数的指针: int (Student::*p)(int a,itn b) , 即在空号内加上类名和作用域。
运用 p=&Student::add; (函数名后不加括号) ,(t.p)(); t为对象名,因为的优先级小于(),故必须在t.p上加括号。
26、返回指针值的函数: 类型名函数名(参数列表) such: int *mymax(int a,int b)
27、指针数组,数组元素是指针 int *p[4];
28、二维指针(即指向指针的指针)int **p=&p1;
29、指向常量的指针:const int *p; 不可以通过指针改变对象的值
30、常指针: char const p; 指针的指向不可改变,必须在定义时初始化
31、指向常量的常指针, const char const p=&a;
32、void类型的指针,可以把非void类型的指针强制转化为void类型的指针,也可以把void类型的指针强制转化成其他类型进行赋值。char p1=”dawda”;void p2;p2=(void)p1; -----注意是void
33、引用,引用传参可改变实参值,一个引用指向不可再改变,不能建立引用的引用,不能建立引用数组,但可以取引用的地址。–定义引用时必须要初始化(做参数时除外)。
34、结构体 struct A{ }; 注意后面加分号,可以在大括号后直接定义对象,,结构体数组 A a[n];
35、结构的赋值是浅赋值,如果有指针,还要手动赋值。(我不会)
36、指向结构体的指针,A *p=&stu,调用 (*p).num或者p->num; 可用于构造简单链表。
37、new的几种用法:int *p=new int ; 开辟一个存放整形的空间,返回一个地址
int *p=new int(100) ; 开辟一个存放整形的空间,是该数的初值为100
char *p=new char [10]; 开辟一个一维数组
A *p=new A; 开辟一个储存结构体的空间
38、枚举类型,enum weekday{sun,mon,tue}; 套式:enum 名字 { 枚举常量表 }; (注意分号) 枚举元素的值是固定的,默认从0开始递增,不可修改,可以在定义时初始化值,如enum weekday{sum=7,mon=1,tue},由于未对tue赋值,默认从mon递增,故tue=2。定义枚举变量 weekday a; 只能把枚举常量的值赋给枚举变量,如:a=sun;或者强制转换赋值:a=weekday(2);
39、用typedef声明新的类型名,如typedef int INTMY,INTMY可以当int用
typedef int NUM[100], NUM n, n是容量为100的整型数组
如果用typedef定义新的struct名,只能定义特定的结构体名,如:
typedef struct{
int month;int day;int year}DATE; //DATE是新的类型名,不是变量
DATE a; 定义变量,其实就是相当于struct A{------};
40、类的数据如果不声明作用域,默认为私有的。
41、内置成员函数:inline void display();-------inline void Student::display(){}
若是在类内定义函数,且函数不含有循环等控制结构,系统将其默认为内置函数。
42、含默认参数的函数(在调用时可以传入小于总参数个数的参数)默认参数以函数声明时为准。 void set(A &t,int hour1=0,int minute1=0,int sec1=0) ------set(a,10);
43、构造函数:一:函数式定义
二:参数初始化表: Box::Box(int a,int b,int c) : height(a),with(b){ }
三:使用默认参数的函数函数。
四:构造函数多次重载(不可出现歧义),如全参默认函数和无参函数。
44、析构函数:静态对象只有在main函数结束后才释放,故需要执行析构函数
两者关系:先构造后析构,后构造先析构;
45、常对象: Time const t; 或者是 const Time t; t中所有数据成员的值都不能被改变。
如果一个对象被声明为常对象,那只能通过此对象调用常成员函数,不可调用普通成员函数
46、常成员函数: void display()const; //将函数声明为常成员函数,它可以访问常对象中的数据成员,但不可以修改,如果必须要修改某个值,可以将其定义为可变的成员函数:
mutable int count; 这时候可以通过常成员函数该变count的值。
47、指向对象的常指针: A *const p; p=&t1; ,指针的指向不可改变
48、复制构造函数,又称拷贝构造函数,用于建立新的对象,书写:Box::Box(const Box b);
系统会默认一个浅复制的函数,如果有指针的话,使用默认的函数会使两个指针指向同一地址。建立深拷贝构造函数,注意一定要加引用,const可以不加。赋值也是用的拷贝构造函数
49、静态数据成员: static int height; 只可以在类外进行初始化: int Bos::height=0;
套式:类型名 类名::数据成员名 = 初值
静态成员函数:static int add();
静态数据成员和静态成员函数都是类的一部分,而非对象的一部分,即所有对象引用的静态数据都相同,可以通过域运算符直接引用,如Box::height-------Box::add();
50、友元函数—直接friend void display(),
友元成员函数 (常需要在作另一个类的声明)在另一个类:friend void Time::display();
需要注意的是友元成员函数要在最后一个类后定义,因为函数要用到后面类对成员
友元类 在B中写friend A;注意A中要用到B中成员的函数都要在B后面定义
51、类模板 template 注意类模板要在每一次用时声明,即在每一次定义函数时声明,而且在类外定义是:compare::compare(A a,A b),类内则不需要,
运用: Box a; 可以同时有多个模板 template<class A,class B>;在定义对象是分别加入类型名:Box <int,double> a;
52、转换构造函数,只能有一个参数,把其他类型的参数改为类的对象型
53、继承和派生是从不同的角度对同意现象的说法,从父类来看,子类是派生,从子类来看是继承 继承的声明 class A: public C{ };继承分为私有,公有和保护继承
访问属性表:
公用继承 保护继承 私有继承
公用成员 公用 保护 私有
保护成员 保护 保护 私有
私有成员 不可访问 不可访问 不可访问
54、派生类构造函数: B(int a,int b,int c) : A(a,b){ }
派生类函数名(参数表):基类名(基类参数表){ }
一般情况而言,子类只需负责其最近父类的构造函数,但如果出现了虚继承,那么子类要负责所有父类的构造函数,且顺序最好按从上到下来。
55、有子对象的派生类的构造函数,A(int a,int b,int c):B(a),Time(b,c) Time是子对象。
56、当父类构造函数为无参时,子类构造函数可以不加父类
如果基类与派生类有相同名字的成员,基类会覆盖派生类(就近原则)
57、多重继承 class A: public B,public C, public D,
58、解决多继承引起的二义性,可以用域运算符解决: c1.A::a=3;(A是类名,a是歧义成员名) c1.B::a=4;
或者使用虚继承: class A:virtual public B 注意派生类初始化时要初始化所有基类
59、基类与派生类的转换: 可以用子类对象对基类赋值,不能反过来
基类对象的指针可以指向派生类对象,但只能访问派生类中的基类成员
例如:当三个类都有display,当用p->C时它只会输出A有的部分,而不是执行C的display,解决这一问题需要虚函数
60、虚函数:virtual void display() 当函数为虚函数时,p->c.display()就可以输出全部内容。
当类内声明为虚函数时,类外定于可以不加virtual 虚函数可以看作纵向重载。
61、静态关联:又称早期关联,在编译时就进行关联,如函数重载,通过对象调用成员等
动态关联:又称滞后关联,在运行时进行关联,如使用基类指针去调用子类虚函数。
62、虚构析函数:当派生类对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。但如果有基类指针用new开辟一个指向子类的空间,且基类有析构函数,delete指针时会发生只运行基类析构而不运行子类析构。如果想执行子类析构,则将基类析构定义为虚函数。
63、纯虚函数:virtual 函数类型 函数名 (参数列表)= 0 ;如:virtual void display()=0;
含有纯虚函数的类不可建立对象,包含纯虚函数的类称为抽象类
64、cout流对象,cerr是标准错误流,用于输出出错信息;clog是标准错误流
65、流对象的控制符:
流函数 与之作用相同的控制符 作用
precision(n) setprecision(n) 设置实数的精度为n位
width(n) setw(n) 设置字符宽度为n位
fill© setfill© 设置填充字符
unself() resetioflags 终止已设定的输出格式状态,在括号中应指定内容
设置格式状态,都要加setf(),如:setf(ios::left)
作用
iso::left 左对齐
ios::right 右对齐
ios::oct 8进制
ios::hex 16进制
ios::fixed 固定小数
ios::scientific 科学计数法表示
ios::showpos 对正数显示+号
66、输出字符:cout.put()
输入:cin.get() ,cin.getline()
eof函数,表示文件结束。 cin.eof() 为假表示未遇到文件结束符
peek函数 c=cin.peek() 观察下一个字符
cin.putback(ch) 将已被读取的字符ch返回到输入流供后面读取
ignore函数 cin.ignore(n,终止字符),忽略前n个字符,遇到终止字符提前停止
67、ASCII输入输出流:
头文件
输入流: ifstream infile(“f1.txt”) ; 输出流: ofstream outfile(“f1.txt”);
关闭文件 infile.close();
检错:if(!infile) {cerr<<”open error”<<endl;exit(1);
文件限制:
方式 作用
ios::in 以输入方式打开
ios::app 以输入方式打开,写入的数据加在末尾
ios::ate 打开文件,指针指向末尾
ios::binary 以二进制打开
ios::in||ios::out 可读可写
ios::out 以输出方式打开
68、对二进制文件的操作
如:outfile.write((char*)&stud[i],sizeof(stud[i]));
通式:istream&read(charbuffer,int len) ostream&write(charbuffer,int len); 区分ofstream和ostream.
buffer指指针, a.write(p,10);
69、检错程序 if(!outfile) {cerr<<”open error”<<endl;abort()}