1字符串函数
1字符串复制
strcpy(str1,str2);
2字符串部分复制
strncpy(str1,str2,n);
3字符串拼接
strcat(str1,str2);
4字符串部分拼接
strncat(str1,str2,n);
5字符串比较
strcmp(str1,str2);//1大于2,返回1;1等于2,返回0;1小于2,返回-1(比较字符ASCII码)
6求字符串长度
strlen(str);//返回字符串实际长度,不包含‘\0’
2结构体类型
结构体变量可以整体初始化,但不能整体赋值
3枚举类型
enum 枚举类型名{
标识符[=整型常数],
标识符[=整型常数],
...
};枚举类型名=标识符;
为某个成员赋值后,后续成员依次递增(默认为0,1,...)
4指针和链表
1指针必须初始化(指向变量)才能使用
2常指针不能赋值
3二级指针:地址的地址
4指针与二维数组
a[m][n]=*(a[m]+n)=*(*(a+m)+n)
5指针数组和指向数组的指针
int *p[n];//指针数组
int (*p)[n];//指向二维数组的指针
6指向函数的指针
int fun(<参数表>);
int (*p)(<参数表>);//返回值类型、参数表必须完全相同!
p=fun;
(*p)();//用指针调用函数
7const指针
const int *//不能通过指针改变变量的值
int * const//不能指向其他地址
const int * const //前两种结合
8void指针
任何类型的指针都可以直接赋值给void*
不能对void指针进行算术操作
9内存动态分配和撤销
new:
p=new int;
p=new int(n);
p=new int[];//动态数组
在申请的空间释放前,该指针不能指向其他地址
当没有足够的堆空间时,返回空指针
delete:
delete p;
delete []p;
delete [n]p;
5链表
随缘
6类和对象
1成员类型
public:允许类外调用
private:限定在该类的内部调用
protected:该类和类的派生类内调用
2存储空间分配
成员数据单独分配空间
成员函数存放在内存的公用区域中
3面向对象的程序设计的特点:封装性、继承与派生性、多态性
4构造函数
调用
(1)定义类的对象时
(2)调用new或new[]运算符动态创建对象时
对象内存分配与构造函数无关
默认构造函数:没有参数或参数都有默认值的构造函数
定义静态对象只调用一次构造函数
赋值语句涉及的临时变量的构造和析构
构造函数可以实现类型转换
Point p1(5,10);
p1=(50,100);//实现了强制类型转换
5析构函数
一个类中只能定义一个析构函数
析构函数在对象释放时自动调用
先构造的后析构
局部先于静态/全局析构
6复制构造函数
只有一个参数,必须是对某个对象的引用
对象作为实参做值传递时调用复制构造函数
每个类必须有一个复制构造函数
字符指针的深拷贝
class A{char *p};
A::A(const A &a){
if(a.p){
p=new char[strlen(a.p)+1];
strcpy(p,a.p);
}
else p=0;
}
7对象成员
先调用对象成员类的构造函数,再调用该类的构造函数
对象成员调用顺序取决于定义的顺序
8友元函数和友元类
友元函数的主要作用是在类外访问类的所有成员数据
友元类:友元关系不能被继承,且是单向的
class B;//预引用
class A{
public:
friend B;//有预引用,不加class
};
class B{
};
class A{
public:
friend class B;//无预引用
};
class B{
};
9静态成员
静态数据成员:类外初始化,不加static,是类的成员
静态函数成员可以直接引用静态成员,不能直接引用非静态成员,需要通过对象来引用(对象名.成员)
10常对象
常对象只能调用常成员函数和静态成员函数
常数据成员只能在构造函数中通过初始化列表的方式完成初始化,
常函数成员的定义,const在形参表后出现,修饰this指针
11this指针
隐含的指针,指向对象本身,代表对象的地址
成员函数中含有this指针而友元函数中不含
将const写在函数头部和函数体之间修饰this指针
类的非静态函数成员都有this指针
7继承与派生
1派生类
包含基类的除构造和析构函数外全部成员
2基类成员访问控制
基类的私有成员在派生类中需要通过公有成员函数访问
3派生类的构造与析构函数
先调用基类的构造函数,多重继承时,根据继承先后顺序调用;再调用对象成员的构造函数;最后调用派生类的构造函数
4冲突
作用域运算符区分基类成员(只能使用一次)
限定基类中访问权限为私有成员
5支配规则
6赋值兼容规则
基类兼容派生类,派生类不兼容基类
7虚基类
class A;
class B:virtual public A;
class C:public virtual A;
class D:public B,public C;
D中只保留一份共同基类的成员
在每一个派生类构造函数成员初始化列表中必须给出对虚基类构造函数的调用,但只在最终派生类中直接调用一次构造函数
8多态:静态绑定通过函数重载和运算符重载实现,动态绑定通过继承关系和虚函数实现
1虚函数
virtual void fun1(){};
构造函数调用类中的虚函数时,只调用该类中定义的虚函数,如没有则调用基类中的虚函数;成员函数中则根据虚函数特性(根据对象调用对应类的虚函数)
静态成员函数不能声明为虚函数
2纯虚函数和抽象类
含有纯虚函数的基类不能定义对象,只能作为基类派生子类,因此是一个抽象类
3运算符重载
至少有一个操作数是类的对象
不能重载的运算符1. 2:: 3?: 4sizeof 5.*/->
运算符重载不改变运算符的优先级和结合性,不能改变操作数的个数
除new和delete之外,不可重载为静态成员函数
赋值运算符必须通过成员函数重载,插入、提取运算符必须通过友元函数重载
4类型转换函数
operator <数据类型>(){};
不允许带参数,不可以指定返回值类型,返回值类型即为数据类型
9输入输出流类库
1重载提取运算符
friend istream & operator >> (istream &,<类名> &)
istream & operator >> (istream &is,<类名> &){
is>>...;
return is;
}
2重载插入运算符
friend ostream & operator << (ostream &,<类名> &)
ostream & operator << (ostream &os,<类名> &){
return os<<...;
}
3文件打开、读写、关闭
ofstream of("filename");
of<<...;
of.close();
ifstream if("filename");
if>>...;
if.close();