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

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值