84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
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
不是為空, 而是使用預設行為, 還是呼叫會成員的析構函數, 這一點跟直接寫{}沒什麼本質區別.