C++面向对象
源程序的编译与链接
ifndef
目的:为了防止重复包含导致的编译错误
#ifndef xxx
#define xxx
函数声明
#endif
Makefile
目的:多文件的编译链接
# 注释
# 冒号前为任务,冒号后为条件,任务步骤为新一行然后缩进
all: main.exe
main.exe: main.cpp student.cpp
g++ -o main.exe main.cpp student.cpp
clean:
del *.obj *.exe
基础语法
auto变量
由编译器根据上下文自动确定变量的类型
new/delete
指针变量所指内存可以通过new/delete运算符在程序运行时动态生成和删除
左值引用
类型名 & 引用名 变量名
给变量名取一个新名字,变量必须是定义好的,可以是结构变量
右值引用
类型名 && 引用名 表达式
给临时变量取名,为了减少临时变量拷贝的开销
decltype
由变量推出类型
for(😃
冒号前为用于迭代的变量,后为将被迭代的范围
函数重载
必须保证至少有一个函数参数的类型有区别。
函数参数的缺省值
必须从后面往前面设置缺省值
函数类型追踪
int func();
auto func() -> int;
类
// 成员函数两种定义方式
class Matrix {
public:
void fill(char dir) {
...;
}
}; //在类外定义成员函数
void Matrix::fill(char dir) {
...;
} //在类外定义成员函数
this指针:指向当前对象的指针变量
类成员的访问权限:public;private(缺省属性)
友元:使用friend关键字,允许某些函数访问对象的私有成员
构造函数
没有返回值,函数名与类名相同,可以重载
析构函数
名称是"~类名",没有返回值,没有函数参数,用于释放对象占用的资源或其他后处理
拷贝构造函数
在已有对象基础上生成新对象
赋值运算符重载
ClassName& operator= (const ClassName& right) {
if (this != &right) {
// 将right对象的内容复制
}
return *this;
}
流运算符重载
istream& operator>> (istream& in, Test& dst);
ostream& operator<< (ostream& out, const Test& src);
函数运算符重载
ReTurnType operator (Parameters) {
...
}
下标运算符重载
ReTurnType operator [](Parameters) {
...
}
重载前缀++/–和后缀++/–
// 前缀
ReturnType operator ++();
ReturnType operator --();
// 后缀
ReturnType operator ++(int dummy);
ReturnType operator --(int dummy);
静态成员
使用关键字static修饰,某个类的所有对象共享
常量成员
使用关键字const修饰,只能在构造函数的初始化列表中被修饰
default
默认函数定义或声明加上=default,编译器会自动生成
继承
常见的继承方式:
private(缺省方式):class Derived:Base{…};基类public对象,派生类对象无法引用
public:class Derived:public Base{…};基类public对象,派生类对象可以引用
继承基类的构造函数:using Base::Base
函数重写(override):函数名函数参数一样,会把其他重载函数屏蔽,恢复需要使用using 基类名::函数名
虚函数
在返回值前加virtual关键字,编译器根据引用变量的实际类型决定调用基类或派生类重写的函数。
使用final关键字修饰的虚函数,派生类不可对它进行重写
使用=0修饰的为纯虚函数,用来定义接口
自定义类型转换
// 方法1 在源类中定义目标类型转换运算符
class Src {
operator Dst() const {
return Dst();
}
};
// 方法2 在目标类中定义源类对象作参数的构造函数
class Dst {
Dst(const Src& s) {
}
}
禁止自动类型转换
使用explicit关键字
使用=delete修饰
强制类型转换
dynamic_cast<Dst_Type>(Src_var)
Src_var必须是引用或指针类型,Dst_Type含有虚函数
static_cast<Dst_Type>(Src_var)
基类对象无法转成派生类对象,非继承的必须提供转换途径
函数模板
template <typename T>
类模板
template <typename T,unsigned size> class array {
T elems[size];
...
}
函数特化
template<> char* sum(char* a, char* b) {};