关于C++中的一些特殊函数inline,virtual等等

预处理 编译 汇编 链接
预处理: 宏替换,删掉注释,头文件的添加到一个文件中等等
编译: 将预处理后的 .i 文件进行一系列语法分析,词义分析,语义分析等等生策划那个.s 文件

inline内联函数
  1. 作用:内联函数是为了解决c语言中表达式形式的宏定义来解决程序中函数调用的效率问题,
  2. 产生的原因:c语言中表达式形式用宏来定义,但是宏是在预处理阶段被处理的,就只是简单的替代,并没有替换类型的检查,等等一系列操作,调用宏并不会产生额外的空间和时间的操作,效率会更高一点,但是宏 不能访问类的私有成员 宏也非常容易产生二义性 宏在预处理阶段不会进行参数的检查 。所以C++就使用了inline函数来解决这个事情,让编译器处理这个inline函数,编译器可以对语法语义等进行分析
  3. 内联函数与普通函数的区别
    普通函数: 如果main函数调用一个a函数,系统会先跳到a函数入口地址 -> 执行函数体 再返回到原函数调用的地方继续执行
    内联函数: 如果函数调用一个内联函数, 函数不需要进行寻址的过程,会直接将函数copy过来,执行函数体
    所以内敛函数的使用不需要寻址,进而提高了函数的效率
    但是这个拷贝阶段是在什么时候进行的呢,在编译阶段直接进行拷贝(内联)
  4. 内联函数与宏的区别,除了处理阶段不同外,内联函数实际上是一个函数,有返回值,参数列表,函数体,而宏只是一般的表达式
  5. 内联函数可以是虚函数么?虚函数可以是内联函数,内联可以修饰虚函数,当虚函数表现多态性的时候不能内联
    内联函数是在编译器阶段进行函数内联,但是虚函数的多态性是在运行期间,编译器并不能直到运行期间运行哪个代码,因此虚函数表现是多态的时候不可以内联
  6. C++中,类中的函数体默认是inline函数(隐式定义内敛函数)
  7. 一般小于十行的时候使用内联函数
虚函数
virtual 虚函数
  1. 为了实现C++的多态,C++使用了一种动态绑定的技术,这个技术的核心就是虚函数表(虚表)
    每个虚函数的类都有自己的虚拟表vptr(一个包含虚函数的基类有自己的虚表,继承了这个基类的派生类也拥有自己的虚表,因为派生类也需要实现这些虚函数),是在编译阶段编译器设置的静态指针数组(只有虚函数才拥有虚表,抽象类中的一般函数不拥有虚表),需要注意的是,同一个类的所有对象只需要一个虚表,继承了拥有虚函数的类的类也拥有自己的虚表在这里插入图片描述

  2. 虚函数的参数默认值
    基类默认覆盖子类的默认值。参数并不是动态绑定的,而是根据调用者的类型决定的,虚函数调用的是子类的方法,方式参数默认的是基类的

class Base{
   
    public:
    virtual void fun(int x=10)
    {
   
        cout<<"Base::fun(),x="<<x<<endl;
    }
};

class Derived: public Base{
   
    public:
    virtual void fun(int x=20)
    {
   
        cout<<"Derived::fun(),x="<<x<<endl;
    }
};

int main()
{
   
    Derived d1;  
    //d1.fun();
    Base *bp=&d1;
    bp->fun();   //Derived::fun(),x=10
    return 0;

}

bp是基类Base* 类型,参数调用的是Base的参数,静态绑定,但是因为指向的是d1 也就是Derived派生类,由于动态绑定的原因,会直接调用Derived::fun()
虚函数还是不要写默认参数比较好
3. 构造函数不可以是虚函数,构造函数的目的是用于初始化实例的,创建一个对象是需要明确对象的类型的,如果构造函数时虚函数,虚函数是在运行时确定对象的类型的,在编译阶段,编译器如果不知道对象的类型对象是无法被创建成功的。
4. 基类的虚函数可以是私有的,但要把main函数设置成是友元函数
当基类的虚函数是公有的,继承类实现的虚函数是私有的也是可以的

class Base{
   
    private:
    virtual void fun()   //虚拟类
    {
   
        cout<<"Base Fun"<<endl;
    }
    friend int main();   //友元函数
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值