84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
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
不是为空, 而是使用默认行为, 还是调用会成员的析构函数, 这一点跟直接写{}没什么本质区别.