- 1. 引用:
- 引用作为别名时,声明时就必须初始化
- 常用作函数得形参,使用引用即使用源数据,而不是其副本=\
- 传递类对象参数得标准方式一般是按引用传递
- 指针是变量,可重新赋值,但引用不行
- 使用时必须初始化,且不能再指向其他变量
-
2. 内联函数
-
3. 默认参数的函数
-
函数中某个参数设置了默认值,则它右边的参数也都要有默认值
-
4. 函数重载
-
5.
extern "C
主要用于能够正确实现 C++ 调用其他 C 语言代码,加上 **extern "C"
**之后,会指示编译器这部分代码按照 C 语言的进行编译,而不是 C++ 的。 -
6. 函数模板和类模板
-
7. 构造函数
-
构造函数的名称和类名相同,通过函数重载,可以创建多个同名的构造函数。
-
构造函数没有声明类型。初始化与构造函数的参数列表相匹配。
-
如果不实现构造函数,编译器会生成一个默认构造函数;如果自己实现,则编译器不会生成。
-
8. 析构函数
-
系统默认的析构函数:如果构造函数没有使用 new,只需编译器生成一个什么都不用做的析构函数即可。
-
如果构造函数使用 new 来分配内存,则必须使用 delete 提供的析构函数释放这些内存。
-
static 数据成员和成员函数
-
static 修饰类中成员,表示类的共享数据
-
static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。
-
使用 static 成员变量必须在类外进行初始化。
-
用 static 修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用 static 修饰的变量在静态存储区生成的。
-
由于 static 修饰的类成员属于类,不属于对象,因此 static 类成员函数是没有 this 指针的(this 指针是指向本对象的指针)。正因为没有 this 指针,所以 static 类成员函数不能访问非 static 的类成员,只能访问 static 修饰的静态类成员。
-
普通成员函数可以通过对象名进行调用,而 static 成员函数必须通过类名进行调用(因为它与类关联)。
-
9. 动态内存分配
-
new/delete是运算符(关键字),malloc/free是函数调用。
-
10. 拷贝构造函数
-
调用拷贝构造函数的时机:
-
1.定义一个新对象并用一个同类型的对象进行初始化时
-
2.对象作为实参或函数返回对象时
-
定义一个拷贝构造函数的固定形式:
Student(const Student& s);
-
11. 浅拷贝和深拷贝
-
如果不定义拷贝构造函数,则编译器会使用默认拷贝构造函数,是浅拷贝
-
浅拷贝遇到含有指针的对象类型时很容易出问题,因为浅拷贝出来的对象和原对象的指针都指向同一个内存空间,当其中一个对象被析构后,另一个对象再使用时就会发生内存溢出。
-
深拷贝遇到指针时,会重新分配一块空间,因此不会有问题。
-
12. 什么时候需要定义拷贝构造函数
-
1.类数据成员有指针
-
2.类数据成员管理资源(如打开一个文件)
-
3.一个类需要析构函数释放资源时,那它也需要一个拷贝构造函数
-
const 关键字
-
初始化 const 成员变量的唯一方法是使用初始化列表(不能在构造函数的函数体中初始化)。
-
const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值, 这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。
-
常成员函数需要在声明和定义的时候在函数头部的结尾加上 const 关键字
-
在 C++ 中,const 也可以用来修饰对象,称为常对象。一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。
-
13. 运算符重载
-
运算符重载可以选择使用成员函数或非成员函数来实现。
-
非成员函数应是友元函数,这样才可以直接访问类的私有数据。
-
运算符重载的限制
-
1、为防止用户为标准类型重载运算符,重载后的运算符必须至少有一个是用户自 定义类型的数据。
-
2、不能违反运算符原有的运算规则。
-
3、不能重载不存在的运算符,即不能创建新的运算符
-
4、以下运算符不可重载:
sizeof :sizeof运算符 . :成员运算符 .* :成员指针运算符 :: : 域解析运算符 ? : 条件运算符 typid : RTTI运算符 const_cast、dynamic_cast、reinterpret_cast、static_cast :强制类型转换
-
5、只能用作成员函数重载的运算符:
= :赋值运算符 () :函数调用运算符 [] :下标(索引)运算符 -> :通过指针访问类成员的运算
-
C++ 的运算符重载可以作为成员函数重载,也可以作为非成员函数(友元)重载,两者之间最重要的区别在于重载函数的参数列表的不同,作为成员函数重载的时候会隐式的传递 this 指针,而作为非成员函数进行重载的时候需要显式传递。+ C++ 中 ++、-- 运算符的重载式很特别的存在,它们有独特的格式,分为前自增(自减)和后自增(自减)。为了编译器能够进行区分,引入了一个额外的 int 进行区分,但这个 int 不含有实际意义
-
13. 类之间的关系
-
is-a 继承体现
-
has-a 组合体现
-
继承的意义
-
代码重用
-
体现不同抽象层次
-
公有继承:`class Teacher: public Person
-
子类只能访问父类的public和protected成员,不能访问private成员。
-
在构造一个子类时,父类部分由父类的构造函数完成,子类的部分由子类的构造函数完成。
-
构造一个子类时,先构造父类,然后构造子类,析构时相反。`
-
多态:同样的方法调用而执行不同操作、运行不同代码。
-
14. 虚函数与抽象类