美文网首页
C++ 常见问题

C++ 常见问题

作者: Youzhicha | 来源:发表于2020-11-11 21:26 被阅读0次

    1. 什么是多态 ?其有哪些实现方式,不同实现方式有河区别 ?

    多态是:不同类的对象收到相同的消息时,得到不同的结果。

    方法的重载和重写,都是实现多态的方式。

    重载,是编译时的多态性。其发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载。

    重写,是运行时的多态性。其发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

    2. const, static 有啥区别 ?

    const,就是只读的意思,只在声明中使用。

    static, 规定作用域和存储方式。
    (1)对于局部变量,
    static 规定其为静态存储方式, 每次调用的初始值为上一次调用的值, 调用结束后存储空间不释放。

    (2)全局变量, 如果以文件划分作用域的话, 此变量只在当前文件可见;对于static函数也是在当前模块内函数可见。

    函数 :

    const,
    返回只读变量的函数。某个对象生存期内是常量,而对于整个类而言却是可变的。
    const常量成员变量不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。

    static,
    规定此函数只在当前模块可见。
    类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。
    static静态成员变量不能在类内部初始化。

    类:
    const,
    一般不修饰类。
    static,
    C++中似乎没有静态类这个说法, 一般还是拿类当特殊的变量来看。

    3. 对虚函数理解 ?

    虚函数,是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这样的函数调用发生在运行阶段,称为动态联编。其是泛型技术之一。

    泛型技术:使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。

    虚函数的工作原理

    编译器处理虚函数的方法:

    为每个类对象,添加一个隐藏成员,其保存了一个指向函数地址数组的指针,称为虚表指针(vptr),这种数组成为虚函数表(virtual function table, vtbl)。即:

    (1)每个类,使用一个虚函数表(虚函数的地址表);
    (2)每个类对象,用一个虚表指针;
    (3)派生类对象,也将包含一个虚表指针,指向派生类虚函数表。
    (4)如果基类中的虚方法没有在派生类中重写,那么派生类将继承基类中的虚方法。
    (5)派生类中虚函数表,将保存基类中未被重写的虚函数的地址。
    (6)如果派生类中定义了新的虚方法,则该虚函数的地址也将被添加到派生类虚函数表中。

    调用虚函数

    程序将查看存储在对象中的虚函数表地址,转向相应的虚函数表,使用类声明中定义的第几个虚函数,程序就使用数组的第几个函数地址,并执行该函数。

    4. 析构函数可以为虚函数吗 ?

    主要是基类指针指向子类对象的情况下,在基类销毁时,只调用基类的析构函数而不调用子类的析构函数,从而导致内存泄漏,所以需要虚函数机制来帮助系统' 识别 '需要释放资源。

    5.构造函数为什么不能是虚函数?

    虚函数采用的是虚调用的办法, 是一种可以在只知道部分信息的情况下正常工作的机制,只知道接口而不知道准确的对象类型的函数 。

    但是,要创建一个类对象,必须要让构造函数知道对象的准确类型,所以构造函数不能为虚!

    6.内存管理中的堆、栈 的区别 ?

    栈:由系统自动分配,速度较快。但程序员是无法控制的。

    堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

    7. vector 释放的理解 ?

        (1)直接声明的vector容器是一个普通变量,相当于一个未知大小的动态数组,不需要手动释放,超出作用于范围时会自动回收。
    
        (2)如果是vector *vec = new vector<>( )这种方法动态创建的vector,则需要delete vector;
    
        (3)如果vector里面存放的是元素而不是指针,这些元素会随vector的释放而自动释放; 
    
        (4)如果vector里面存放的是指针,并且指向自己new或malloc的数据,那么需要一个一个手动释放指针。也就是上面代码的情况。
    

    相关文章

      网友评论

          本文标题:C++ 常见问题

          本文链接:https://www.haomeiwen.com/subject/xzjybktx.html