您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-15 11:16 309 查看

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();            //invalid

Father *ptr=new Son;
ptr->fn();          //valid


纯虚函数

虚函数原型后面加上"=0"表示纯虚函数,作用是提供接口给派生类实现,有纯虚函数的为抽象类,不能实例化
virtual void fn()=0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: