一 构造析构常识:
1,c++ 处理类,若没有声明,则编译器默认声明构造,拷贝赋值,拷贝构造,析构函数。所有这些函数都是public且inline的。
2,编译器产出的析构函数是非虚函数。(non-virtual)。
3,拷贝构造和拷贝赋值函数作用就是拷贝非静态成员变量到目标对象处。
4,如果打算在内部含有引用成员的类内支持赋值操作,必须自己定义拷贝赋值函数。operator =
5,若不想使用默认函数,最好在编程时候明确拒绝。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
因为有时候我们不想使函数为public。但是编译器产生的函数都是public的。
有时候我们为了不让别人调用我们的函数,回声明为私有,但是这种函数还是会被友元和内部函数调用,因此,一般的处理方式是声明成私有,且不实现它,并通过私有继承该BASE类,完成操作(不允许调用该函数的操作)。
上述5是为了有效驳回编译器提供的默认函数:
class A{ protect: A(){}; ~A(){}; private: A(const A& ); A& operator=(const A&); } class B:private A{ }
::::::::::::
二 为多态基类声明虚析构
原因是:一般我们经常用基类指针指向派生类对象进行操作,当我们声明的base类没有virtual析构函数时候,派生类对象经由基类指针删除会造成未定义结果。
实际经常出现对象派生成分没有被销毁,基类成分通常是被销毁了的。这就造成一个局部销毁的现象。形成资源泄露。
解决这个问题的方法是给基类声明虚析构函数。(虚函数一般是为了实现多态而不实现的)
(任何类只要带有虚函数都应该有一个虚析构,如果一个类没有虚函数,通常表示它并不想作为一个基类来使用)
纯虚函数应用:当我们想要一个基类,抽象类总是被当做一个基类来用的,而基类又应该有一个虚函数,纯虚函数会构成一个抽象类,因此,你想声明的基类抽象类应该具有一个纯虚析构函数。virtual ~FUN()=0;
析构函数运作方式:最深层派生类的析构函数最先被调用。然后是每一层基类的析构函数。由内到外调用析构。
总结:多态性的类应该有虚函数,有虚函数就行该有虚析构,且被作为基类使用。
当你声明的类不想让他作为基类、不想他具有多态性,就不应该有虚函数或虚析构。
三 别让异常逃离析构函数
首先,c++出现两个或更多同时存在的异常的时候,会导致程序结束或者不明确行为。
注意:构造和析构都可以写异常,但是一般我们不建议。。
注意:析构函数绝对不要吐出异常,会导致内存泄漏,如果被析构函数调用的函数可能抛出异常,析构函数应该具备捕获任何异常的能力。然后吞下他们,或者结束程序。
如果客户需要对某时刻某函数运行抛出的异常做出反应,最好提供一个普通函数进行异常处理。
这里异常抛出点以后的程序是不执行的,若异常未被处理,则一直向外层抛出,知道被处理,或者程序结束了(没有能处理该异常)。当异常被捕获,并处理,则该捕获层之外的代码,还是可以被执行的,但是异常抛出点后边剩余的代码是不会被执行了,除非你处理完异常之后进行goto跳回。