c++primer plus阅读笔记(六)

来源:互联网 发布:win7 内存优化 编辑:程序博客网 时间:2024/05/21 18:35

c++自动提供的成员函数

默认构造函数,如果没有定义构造函数默认析构函数,如果没有定义拷贝构造函数。如果没有定义赋值运算符,如果没有定义地址运算符,如果没有定义。

什么时候调用拷贝构造函数

Time time_ob_2(time_ob_1);Time time_ob_2 = time_ob_1;Time time_ob_2 = Time(time_ob_1);Time *time_ob_2 = new Time(time_ob_1);其中要特别注意第二种并非是重载了等号运算符,在声明类的时使用等号赋值方法会被编译器直接优化成第一种方式,试验中所有都被优化成第一种形式。

c++11空指针

char * str=nullptr;//c++11 null pointer notation

直接调用构造函数

直接调用构造函数会产生一个临时对象,生命期为当前语句。

继承构造顺序

首先创建基类对象,调用基类的构造函数;析构的时候与构造相反,先调用派生类的析构函数,然后自动调用积累的析构函数。

派生类和基类

基类指针和引用都可以不通过显示类型转换指向派生类,但是只能调用基类的方法。但是派生类的指针和引用无法隐式转换到基类,因为转化成功后,该指针无法调用派生类的成员。

虚函数

虽然基类的指针(引用)对派生类的兼容性,但无法调用派生类的成员,如:Cycle a;Motocycle b;cycle *ptr=&b;b->fn();        //use Cycle::fn();---------------------------------------------------------如果将fn()定义成虚函数class Cycle{...virtual void fn();...}b->fn();        //use Motocycle::fn()---------------------------------------------------------1.只要基类声明某个函数,子孙类中类型完全相同的函数也为虚函数(也可以显示声明)。

虚函数表

1.编译器为每一个对象添加一个隐藏成员,隐藏成员保存了一个指向当前对象的虚函数地址数组的指针2.执行的时候通过判断当前指针所指向的对象的类型从而决定使用哪个虚函数表。

虚函数注意事项

1.派生类不继承,所以讲构造函数声明为虚没有意义,构造函数不能够是虚拟函数2.析构函数应当是虚函数,因为Father *ptr=new Son;...delete ptr;3.虚函数是从当前指针(引用)对象开始找fn(),如果找不到则会向上(基类)寻找。4.派生类通过参数对函数(虚函数)进行重载后,会将基类同名函数隐藏,但是这对于兼容性的基类指针(引用)来说没有影响,因为虚函数表和执行方式没有发生改变。class Father{...void fn();...};class Son{...void fn(int a);...};Father fa;fa.fn();            //invalidFather *ptr=new Son;ptr->fn();          //valid

纯虚函数

虚函数原型后面加上"=0"表示纯虚函数,作用是提供接口给派生类实现,有纯虚函数的为抽象类,不能实例化virtual void fn()=0;
原创粉丝点击