快排C++实现-手撕代码
http://www.cnblogs.com/pugang/archive/2012/06/27/2565093.html
算法原理理解:http://data.biancheng.net/view/71.html
转自https://blog.csdn.net/txl199106/article/details/44759601
对象实例化时,先调用父类的构造函数,再调用子类的构造函数
销毁delete时,先调用子类的析构函数,再调用父类的析构函数
1、为什么构造函数不能是虚函数?
因为:从使用上来说,虚函数是通过基类指针或引用来调用派生类的成员的,则在调用之前,对象必须存在,而构造函数是为了创建对象的。
2、为什么在派生类中的析构函数常常为虚析构函数
注意,默认不是析构函数
一句话,是为了避免内存泄露
如果不考虑虚函数的状况,给出一个基类和派生类,如果调用派生类的析构函数时,肯定会引发调用基类的析构函数,这和析构函数是不是虚函数没关系。
现在考虑虚函数的问题,由于使用虚函数使我们可以定义一个基类指针或引用可以直接对派生类进行操作,这就存在两种情况:
如果,不把基类的析构函数设置为虚函数,则在删除对象时,如果直接删除基类指针,系统就只能调用基类析构函数,而不会调用派生类构造函数。这就会导致内存泄露。
如果,把基类的析构函数设置为虚函数,则在删除对象时,直接删除基类指针,系统会调用派生类析构函数,之后此派生类析构函数会引发系统自动调用自己的基类,这就不会导致内存泄露。
所以,在写一个类时,尽量将其析构函数设置为虚函数,但析构函数默认不是虚函数。
神经网络参数更新方法及其优缺点:
总结来说:随机梯度下降SGD
动量方法
逐参数适应学习率方法
学习参考链接:
https://blog.csdn.net/u010223750/article/details/51334561