本篇文章来讲解C++中构造函数和析构函数的一些比较重要的知识,主要包括下面几个:
1.构造函数和析构函数,没有返回值。2.如果实现多态的话,析构函数需要是虚函数。3.构造函数不能是虚函数。4.构造函数和析构函数不能调用virtual函数。
1.构造函数和析构函数没有返回值?
原因:程序中对象的创建和销毁是一个非常特殊的事情,有编译器来调用它们来完成,而这里的构造函数和析构函数便是创建和销毁的两个函数,它们是作为钩子函数来被编译器调用的。
也正是因为如此,它们才不需要有返回值,因为一旦有了返回值,编译器就必须知道如何来处理返回值,而编译器有没有办法做决策,只能放权给程序员来操作,这和构造函数和析构函数的调用机制是冲突的,所以构造函数和析构函数才没有返回值。
2.多态的时候,为什么析构函数需要是虚函数?
当然,我们可以在多态的时候,不将构造函数定义成虚函数,这样也是可以编译运行的,并且指定继承类创建和销毁的时候,也没有问题。
可是,我们实现多态的目的是什么呢?其实就是为了创建一个继承类,但是指针却是基类,我们在使用这个基类指针的时候,却可以在程序运行的时候去执行对应的继承类的对应函数。常用例子,可以参考工厂模式。
既然我们希望用基类的指针去表示继承类,这种情况下如果析构函数不是虚函数,就有可能出问题,基类指针析构函数被调用时,不会去释放继承类自己部分的那一部分数据,会导致这部分数据释放不掉。
3.构造函数为什么不能是虚函数?
这个跟多态的实现机制有关系,多态对虚函数的实现,是先给一个类对象实例化一个虚函数指针,再把这个虚函数指针指向虚函数列表,从而实现多态。
构造函数是类对象实例化的时候,首先调用的,所以一旦一个类有对象了,那么构造函数就调用完了,也就是说构造函数被调用的时候,并没有对象生成,没有对象也就没有虚函数指针,而虚函数的函数地址都是会存储在虚函数列表的,构造函数都执行完了结果还没有去找这个虚函数对应虚函数列表中的位置。
4.为什么构造函数和析构函数不能调用virtual函数?
构造函数不能使用virtual的原因与3中的原因类似,不过不同的是执行构造函数的时候,构造函数里面执行虚函数的话,没有办法通过这个对象的虚指针去找到虚函数列表。因为这个时候类对象还没有创建起来,所以找不到虚函数指针。
析构函数在继承类的析构函数被调用的时候,对象内的类变量被认为是未定义的值,所以也就没有办法找对对应的虚函数列表,当然也就没有办法找对虚函数列表中的对应函数地址。而在进入了基类的析构函数之后,这个类就被认为是基类的对象了,所以虚函数其实就没有意义了,因为这个虚函数其实对应的就是基类里面的那个函数了,没办法实现多态的作用。
灰子学技术: