析构函数的触发有两个:1)栈上的对象跳出了它的作用域。2)堆上的对象被调用deletes释放
析构函数和构造函数都没有继承的概念!
Class B:public A{
B(int B_1){//可以初始化列表的形式对A的构造函数进行利用如:B(int B_1):A(B_1){ }
//A(B_1); 错误!说明构造函数不能被继承
fun();//在A中的函数
}
}
当调用子类析构函数时会自动调用父类的析构函数,这样会自动往上调用!
当利用虚析构函数这个概念类解决内存泄露(即把含有虚函数的基类的析构函数也设为虚函数,这样在delete base class point的时候能释放掉指向的子类对象,也就是能够调用到子类的析构函数)
虚析构函数还有个作用那就是用来定义abtract抽象类;
1:如果你的Base class中没有Virtual成员函数,但你要他成为抽象类,那么可以
class base{
virtual ~base()=0;
}
什么函数不能声明为虚函数?
一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。
设置虚函数须注意:
1:只有类的成员函数才能说明为虚函数;
2:静态成员函数不能是虚函数;
3:内联函数不能为虚函数;
4:构造函数不能是虚函数;
5:析构函数可以是虚函数,而且通常声明为虚函数。
为什么构造函数不能是虚构函数?
1,从存储空间角度
虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。
2,从使用角度
虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。
关于引用要注意的地方:
int c=9;
const int &bb=14;//对的
int &de=9;//错的//9不能改变,而引用有改的风险,所以不能这样声明!
const int &cc=c;
cc不能改变 但是可以通过改变c来改变cc对于的值,这个在某种情况下起到安全性的作用!
数组与指针: