这些内容是在C++考试前突击复习整理出来的,一些零碎知识、代码和容易混淆、忘记的知识。
这些对编程实践可能并没有什么用,但对于考试的填空选择可能用处不少,因此写出来供我自己和大家参考。
因为时间原因,有些内容还没有经过编程证实,如果有错误还请联系我,我会加以改正。
另外我打算在近期(期末考试结束后?)启用博客的评论系统,到时候方便交流啦~咕咕咕?
零碎知识
- 面向对象程序设计思想的主要特征有:
- 封装性
- 多态性
- 继承性
- C++中用户自定义的数据类型:
class类struct结构体union共用体enum枚举
- 类中不做特别声明的话,所有成员都是
private的。 - 构造函数的作用:
- 给创建的对象建立一个标识符
- 为对象数据成员开辟内存空间
- 完成对象数据成员的初始化
- 析构函数前面的
~是位取反运算符。 - 析构函数的作用是在对象被系统释放之前做一些内存清理工作
被宰之前先拔毛。 - 静态成员函数没有
this指针,即不能通过其访问本对象的成员,所以静态成员函数一般用来访问静态成员而非非静态成员。 - 两种多态性:
- 静态多态性:靠函数重载实现,在编译时即已确定调用的是哪个函数。
- 动态多态性:靠虚函数实现,不在编译时确定调用的函数,运行时才确定。
- 不能重载的运算符:
.成员访问运算符*成员指针访问运算符::域运算符sizeof长度运算符? :条件运算符
- 不需要用户重载的运算符:
=和&。 - 重载运算符的规则:
- 不允许定义新运算符
- 不能改变运算对象(操作数)个数
- 不能改变优先级
- 不能改变结合性
- 不能有默认参数
- 派生时不做特殊说明则继承方式是
private。
代码
函数模板
1
2template<typename T1, typename T2>;
template<class C1, class C2>;相当于生成了几个在使用时才确定的类,可以让函数在调用时确定某些参数的类型,如
1
int func(T1 a, T2 b);
这个
func中的T1和T2会随传入的参数类型的改变而改变,变成它第一个遇到的参数的类,然后在这个函数中的所有T1和T2都会变成相应的类,且只在这个函数的此次调用中生效。
同时需要注意的是隐藏的类型转换(如char可以自动转换成int的这种)不起作用,如果参数表里用的都是T而传入的是两个不同类型的参数,那就会错,此时在调用时应该用强制类型转换或直接舍弃函数模板。拷贝构造函数
1
A(A &a);
运算符重载
用成员函数的方式
1
A operator + (A &a1, A &a2);
因为作为成员函数可以用
this访问本对象的成员,因此可以省略参数A &a1。用友元函数的方式
1
friend A operator + (A &a1, A &a2);
不能省略参数
A &a1。流插入运算符
>>的第一个参数是istream &;流提取运算符<<的第一个参数是ostream &。
继承与派生
虚继承和虚基类
1 | class B: virtual public A |
在多重继承时避免二义性问题。
基类A中的成员变量a如果派生出B、C,再由B、C派生出D的时候在D中访问a会出现二义性问题。
使用虚继承,即声明从A继承的a还是A的a,而不会变成B的a,从而在派生D的时候让D继承A的a,从而不会引起二义性问题。
赋值兼容规则
- 派生类对象可以赋值给基类对象。
- 反之不行。
- 基类对象的指针可指向派生类对象,也就是派生类的指针可以赋值给基类对象的指针,但在有多重继承时基类指针只能调用本基类在派生类对象中的成员,而无法调用其它基类在派生类对象中的成员。
- 派生类对象可以初始化基类型的引用,但在有多重继承时基类引用只能调用本基类在派生类对象中的成员,而无法调用其它基类在派生类对象中的成员。
多态性与虚函数
虚函数
1 | virtual int func(int); |
- 在基类中声明一个成员函数
func为虚函数。 - 在派生类中声明一个同名成员函数
func。 - 用一个基类指针调用
func时即可调用派生类的func;如果不将基类中的func声明为虚函数,则基类指针调用的是基类的func。
注意,构造函数不能声明为虚函数。
纯虚函数
1 | virtual int func(int) const = 0; |
只有声明,没有函数体,不能被调用,相当于在基类中不存在,也因此包含纯虚函数的类无法生成对象。声明它是为了说明在派生类中会出现且被定义,然后就可以用虚函数的方法用基类指针调用派生类的func了。
抽象类
唯一的作用是拿来派生,并不会被用来生成对象只负责下蛋而不会用来吃(不恰当的比喻),凡是包含虚函数的类都是抽象类,因为包含纯虚函数的类无法生成对象。
可以作为函数的参数类型,例如:
现有抽象类A
可以有这样一个函数:
1 | int func(A &a); |
体现了动态多态性。