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)该函数,可实现多态。