构造函数、析构函数、虚函数与内联函数的关系

在语法上没有错误

       首先要掌握一点,构造函数、析构函数、虚函数可以声明为内联函数,这在语法上是正确的
如下面代码是正确的,因为inline同register一样,只是个建议,编译器并不一定真正的内联,在语法上是没有错误的

class A
{
public:
    inline A() {}
    inline ~A() {}
    inline virtual void  virtualFun() {}
};
 
int main()
{
    return 0;
}

构造函数和析构函数声明为内联

       将构造函数和析构函数声明为inline是没有什么意义的,需要思考的是构造函数、析构函数、虚函数被声明为inline有意义吗,或者说编译器是否对这些函数真正内联呢?

先来看构造函数和析构函数,参阅Effective C++得知,将构造函数和析构函数声明为inline是没有什么意义的,即编译器并不真正对声明为inline的构造和析构函数内联,因为编译器会在构造和析构函数中添加额外的操作(申请/释放内存,构造/析构对象等),致使构造函数/析构函数并不像看上去的那么精简

虚函数声明为内联

函数的inline属性是在编译时确定的,然而,virtual的性质是在运行时确定的,文件中的inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。对于inline函数,编译器仍然将它编译成一个有地址的函数。

需要注意的几点:
1.虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联
2.内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。
3.inline virtual 唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::who()),这只有在编译器具有实际对象而不是对象的指针或引用时才会发生
 

	#include <iostream>
	using namespace std;
	// 基类
	class Base{
		public:
			inline virtual void who(){
				cout << "I am Base\n";
			}
			virtual ~Base(){}
	};
	// 派生类
	class Derived:public Base{
		public:
			inline void who(){   // 不写inline时隐式内联
				cout << "I am Derived\n";
			}
	};
int  main(){
	// 此处的虚函数 who(),是通过类(Base)的具体对象(b)来调用的,编译期间就能确定了,所以它可以是内联的,但最终是否内联取决于编译器。
	Base b;
	b.who();
	// 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。
	Base *bptr = new Derived();
	bptr->who();
	delete bptr;
	bptr = nullptr;
	return 0;
	
}

参考:https://www.cnblogs.com/helloweworld/archive/2013/06/14/3136705.html
https://blog.csdn.net/cdlwhm1217096231/article/details/90744265

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值