Effective C++学习笔记(二) 各种构造函数 虚继承 虚基类 抽象类 多态

Effective C++学习笔记(二)

条款05 了解默默编写并调用那些函数
编译器会为每一个类自动生成一个拷贝构造函数、赋值构造函数、和析构函数,并且在被用到的时候,这些函数才会生成。如果没有声明任何的构造函数,编译器也会为你自动生成一个默认构造函数
当类中含有reference或者const成员时,要自己写赋值构造函数,编译器不会自动生成
另外如果基类将赋值构造函数声明为了private,那么编译器不会为其派生类自动生成赋值构造函数
条款06 如不想使用编译器自动生成的函数,就该明确拒绝
为了驳回编译器自动提供的机能,可以将相应的成员函数声明为private并且不予实现。使用像uncopyable这样的base class也是一种做法

class Uncopyable 
{ protected: 
Uncopyable() {} 
~Uncopyable() {} //允许derived对象构造和析构 
private: 
Uncopyable(const Uncopyable&); 
Uncopyable& operator=(const Uncopyable&); //阻止copying };
}
class HomeForSale : private Uncopyable
{
	
}

条款 07 为多态基类声明virtual析构函数
这种情况主要用于实现多态时候的情况,即用基类指针指向派生类,然后delete基类指针,如果基类析构函数不声明为virtual,那么就不会析构基类的那一部分,从而造成内存泄漏等。
任何class只要带有virtual函数几乎确定应该也有一个virtual析构函数,不企图当作基类的类不应该有virtual析构函数,因为任何带有虚函数的class都会生成一个虚函数表,这个表由一个指针指向,如果只是单纯的一个类,则会增加这个类所占用的内存,因为要存储这个指针。
这里说一下抽象类:
抽象类是指含有纯虚函数的类,这种类不能创建对像,即不能实例化,被声明为纯虚函数后,在派生类中一定要实现。
以下解释来自:https://www.cnblogs.com/xuelisheng/p/9278917.html
纯虚函数
virtual ReturnType Function()= 0;
纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
一般而言纯虚函数的函数体是缺省的,但是也可以给出纯虚函数的函数体(此时纯虚函数变为虚函数),这一点经常被人们忽视,调用纯虚函数的方法为baseclass::virtual function.
2.纯虚函数存在的意义
【答案1】四个字:制定标准
纯虚函数是为你的程序制定一种标准,即只要你继承了我,就必须按照我和标准来,实现我所有的方法,否则你也是虚拟的,和JAVA里的接口一样,都是制定标准,为了使程序更加通用化,可重用性提高,让所有实现它或继承自它的子类全部按同一标准来工作,你想想大家都按标准来对程序的益处是什么?
【答案2】在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
【答案3】父类中存在纯虚函数,子类中重写(override)该函数,可实现多态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值