C++基础
-
内联函数
- 关键字inline
- 功能简单、规模较小且使用频繁的函数
- 在编译的时候将函数嵌入在调用它的地方,可以减少参数传递和控制转移等的开销
- 定义位于类声明中的函数会自动被认为内联函数
-
函数重载(多态)
- 在同一个作用域中,两个及以上函数的函数名相同,但是参数类型或者参数数量不同,编译器将根据参数类型和参数个数自动匹配并调用,这就是函数重载。
- 注意:编译器将类型引用和类型本身视为相同的参数。
- 类的成员函数可以重载,不同类的同名函数不是重载
-
extern “C”
- 实现C++调用C语言的代码,提示编译器这部分代码按照C语言进行编译。
- 编译不同之处:C++支持函数重载,函数编译过程中会将函数名以及参数类型加入到编译后的代码中,C语言不支持函数重载,因此编译过程中只将参数名加入到编译后的代码中。
-
函数模板和类模板
- C++多态性的体现,实现高效的代码重用
- 关键字template
- 函数模板
- 函数模板可以重载
- 遇上同名普通函数时,编译器会优先选择普通函数,除非函数模板能产生更好的参数类型匹配,可以通过空模板实参列表的语法限定编译器只能通过模板匹配
- 类模板
- 子类从模板类继承时,需要制定基类的参数类型,如class B: public A
-
类的成员函数
- 可以重载
- 可以使用默认参数
- 一般在头文件中声明,在源文件中定义
-
封装
- 类的定义过程,将抽象得到的数据成员和函数成员形成一个统一的整体
-
类的访问修饰符
- public:类本身、子类、对象
- protect:类本身、子类
- private:类本身
-
构造函数
- 完成对象的初始化工作
- 如果定义了一个带参数的构造函数且不是所有的参数都有默认值,那么必须定义一个不带参数的构造函数,否则调用不带参数的构造函数时会报错
- 子类中构造函数的调用顺序:基类构造函数(按继承顺序)、派生类对象成员的构造函数(按声明顺序)、派生类构造函数
-
复制构造函数
-
什么时候调用
- 用已经定义的对象去初始化其它对象的时候
- 函数的形参是对象类型,完成形参和实参结合的时候
- 函数返回值是对象,函数执行完返回结果的时候
-
什么时候需要自定义复制构造函数(完成深复制)
- 类数据成员有指针的时候
- 类数据成员管理资源的时候,如打开文件
- 需要析构函数释放资源的时候
-
禁止调用复制构造函数
class Uncopyable { private: Uncopyable(const Uncopyable &); //阻止拷贝构造 Uncopyable &operator=(const Uncopyable &); //阻止赋值运算符 };
-
-
析构函数
- 完成对象删除前的清理工作,对象删除前系统自动调用
- 不可以重载
- 可能会被继承的类的虚函数应该声明为虚函数,这样可以使用基类的指针释放子类的空间,否则会发生内存泄漏
- 析构函数调用顺序与构造函数相反:派生类析构函数体、派生类成员对象析构函数、基类析构函数
-
static数据成员
-
实现同类不同对象之间的数据共享
-
访问 类名::静态对象名
-
需要在类外初始化,初始化时不加static
-