1,引用
引用初始化时,将引用和初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成,引用始终和初始值绑定在一起,无法重新绑定,因此,引用必须初始化。
引用即别名,引用并非对象,对其进行的所有操作都是在与之绑定的对象上进行的;
引用本身不是对象,因此不能定义指向引用的指针,但指针是对象,所以存在对指针的引用。
引用做函数形参可以避免拷贝,如果函数无需改变引用形参的值,最好将其声明为常量引用。不要返回局部对象的引用和指针。
2,访问控制
public:成员在整个程序内可被访问,定义类的接口;
private:成员可被类的成员函数访问,不能被使用该类的代码访问;
protected:成员与派生类分享,不被其他共有访问。
友元:类可以允许其他类或其他函数访问它的非公有成员,方法是令其他类或函数成为它的友元。
类的静态成员必须在类外初始化。
3,构造函数
拷贝构造函数调用情况:1,将一个对象作为实参传递给一个非引用类型的形参;2,从一个返回类型为非引用类型的函数返回一个对象;3,用花括号列表初始化一个数组中的元素;4,用=定义变量时;
需要析构函数的类也需要拷贝和赋值操作,(拷贝构造函数和赋值运算符重载);
4,继承:面向对象中的继承指类之间的父子关系
1、子类拥有父类的所有成员变量和成员函数
2、子类就是一种特殊的父类
3、子类对象可以当作父类对象使用(赋值兼容性原则)
4、子类可以拥有父类没有的方法和属性
子类的构造函数调用顺序:先构造父类,再构造成员变量、最后构造自己;先析构自己,在析构成员变量、最后析构父类。
访问控制:public继承(public,protected,private);protected继承(protected,protected, private);private继承(private,private,private)。
友元关系不能被继承;某个类的友元类的基类或派生类不具有像友元类的特殊访问能力;
静态成员不能被继承;
5,多态:一个函数在一个类族中穿梭时,表现出不同的行为;
成员函数若为虚函数,则执行动态绑定;否则,其解析过程发生在编译时而非运行时。
多态成立的三个条件
1 要有继承
2 要有函数重写(虚)
3、父类指针(父类引用)指向子类对象
如果想通过父类指针 执行 所有的子类对象的析构函数,那么需要在父类析构函数前加上virtual关键字;
多态是每个类用了一个虚表,每个类的对象用了一个虚指针。指向派生类的虚函数表。
6, 函数重载:必须在同一个类中进行;子类无法重载父类的函数,父类同名函数将被名称覆盖;重载是在编译期间根据参数类型和个数决定函数调用。
函数重写:必须发生于父类与子类之间;并且父类与子类中的函数必须有完全相同的原型;使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象的类型决定函数调用。
7,函数模板
― 编译器并不是把函数模板处理成能够处理任意类型的函数
― 编译器从函数模板通过具体类型产生不同的函数
― 编译器会对函数模板进行两次编译
―在声明的地方对模板代码本身进行编译
―在调用的地方对参数替换后的代码进行编译
8,vector的内存管理
为支持快速随机访问,vector将元素连续存储;
当不得不获取新的内存空间时,vector和string的实现通常会分配比新的空间需求更大的内存空间;
将已有元素从旧位置移动到新空间,然后添加新元素,释放就存储空间;
size指容器当前拥有的元素个数;而capacity则指容器在必须分配新存储空间之前可以存储的元素总数,也可以说是预分配存储空间的大小。
resize和reserve的区别:
1,resize分配的空间都已初始化,可以访问;reserve分配的空间没有初始化;
2,resize调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。
调用reserve(n)后,若容器的capacity<n,则重新分配内存空间,从而使得capacity等于n。如果capacity>=n呢?capacity无变化。
9,非静态成员函数后面加const
(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为 const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于 mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调 用。
10,
常量和引用,必须通过参数列表进行初始化。
静态函数中不能出现this指针静态函数属于类本身,不与类绑定,因此不能用this指针。
;静态成员变量必须在类外初始化,静态成员常量在类中初始化。
在类定义时,无法使用构造函数,因而无法完成对象的初始化;一般成员变量需要在类内进行初始化
11,函数模板的本质
编译器的两次编译:第一次,先将模板编译一遍,第二次,根据程序调用的不同版本分别为其生成对应的函数版本。
12,模板类中若使用友元函数,要将函数体直接写在函数声明下。分开写有错误。