84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
c++primer:
一个基类总是需要析构函数,而且它能将析构函数设定为虚函数。此时,该析构函数为了成为虚函数而令内容为空。
也就是说虚析构函数一定是这样的形式喽?
virtual ~Deconst()=default;
难道就不能有{ }包围的函数体吗?
学习是最好的投资!
楼上的说的比较清楚了,default会让编译器给你加上一个{}。如果你的这个类持有了一些资源,虚析构函数也不应当为空,需要做一些清理工作。例如:
class A{ public: virtual ~A(){ free(handle); delete ptr; } someFilehandle* handle; somePointer* ptr; };
如果A是作为一个父类,那么它的析构函数尽量声明为virtual以避免以下的情况出现:
class B : public A { public: //some declaration virtual ~B() {} }; //假使你获得了或者创建了一个A*类型的指向一个B*对象 { A* a = new B(); delete a;//如果A的构造函数不是virtual,那么这个时候 //就是一个未定义行为,B的析构函数多半不会调用 //导致可能的资源/内存泄漏。 }
不能,你这里显式定义了用默认析构函数作为你的析构函数,如果要自定义就不是default了
=default不是为空, 而是使用默认行为, 还是调用会成员的析构函数, 这一点跟直接写{}没什么本质区别.
=default
virtual ~Deconst()=default; virtual ~Deconst() {}
楼上的说的比较清楚了,default会让编译器给你加上一个{}。
如果你的这个类持有了一些资源,虚析构函数也不应当为空,
需要做一些清理工作。例如:
如果A是作为一个父类,那么它的析构函数尽量声明为virtual以避免
以下的情况出现:
不能,你这里显式定义了用默认析构函数作为你的析构函数,如果要自定义就不是default了
=default
不是为空, 而是使用默认行为, 还是调用会成员的析构函数, 这一点跟直接写{}没什么本质区别.