C++基础

    xiaoxiao2025-01-13  8

    基本语法

    1. 什么时候使用引用作为函数参数?

    2. 什么时候使用引用做函数返回值?

    3. 使用引用做函数返回值要注意些什么问题?

    4. 什么时候使用常引用?

    5. 引用和指针的区别和联系?

    6. const定义常量和#define 定义宏的优缺点?

    7. C++中使用哪些技术可以替代宏?为什么建议使用使用这些技术去替代宏?

    8. malloc/free和new/delete的区别和联系?

    9. 在C++程序中调用被C编译器编译后的函数,为什么要加extern”c”?

    类和对象

    1. C++中struct和class的区别?

    2. 实现一个简洁版class String.

    3. 实现一个简洁版模板类class Array.

    4. 实现一个简单的智能指针class SmartPtr.

    5. 说说你对单例模式的理解,实现一个单例类class Singleton.

    请简述智能指针原理,并实现一个简单的智能指针

    如何处理循环引用问题

    请事先一个单例模式的类,要求线程安全

    如何定义一个只能在堆上生成对象的类

    如何定义一个只能在栈上生成对象的类

    const和define的区别

    define和inline的区别

    malloc和new的区别

    C++中static关键字作用

    C++中const关键字作用

    C++中包含哪几种强制类型转换?他们有什么区别和联系

    简述C++虚函数作用及底层实现原理

    答:     虚函数可以实现多态。   编译器将为实现了虚函数的基类和覆盖了虚函数的派生类分别创建一个虚函数表(Virtual Function Table,VFT)。也就是说Base和Derived类都将有自己的虚函数表。实例化这些类的对象时,将创建一个隐藏的指针VFT*,它指向相应的VFT。可将VFT视为一个包含函数指针的静态数组,其中每个指针都指向相应的虚函数。

    一个对象访问普通成员函数和虚函数那个更快

    在什么情况下,析构函数需要是虚函数

    答:   可能有基类指针,指向的确是派生类成员的情况。   如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。

    内联函数,构造函数,静态成员函数可以是虚函数吗

    答:1.内联函数:不能为虚函数   因为内联函数是在编译期展开的,而虚函数是在运行时确定的。如果一个声明为内联函数的函数在虚表中,这证明编译器在编译时忽略了让函数内联的请求,将内联函数以普通函数处理了。   2.构造函数:不能为虚函数    虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。   3.静态成员函数:不能   因为静态成员函数是属于类的,而虚函数是属于对象的。

    构造函数可以调用虚函数吗

    答:构造函数可以调用虚函数,但是不建议。   在基类构造的时候,虚函数是非虚的:   当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中积累部分,子类还没有构造,没有初始化,如果在基类构造函数中使用虚函数,就是在调用一个还没有初始化的对象。所以C++是不可以在构造父类对象部分的时候调用子类的虚函数实现。

    析构函数可以调用虚函数吗

    答:不要   在析构的时候会首先调用子类的析构函数,析构掉对象的子类部分,然后调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数。这是很危险的。

    简述C++虚继承的作用及底层实现原理

    答:作用:   为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。   这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。 底层实现原理:   底层实现原理与编译器相关,一般通过虚基类指针实现,即各对象中只保存一份父类的对象,多继承时通过虚基类指针引用该公共对象,从而避免菱形继承中的二义性问题。

    C++中成员函数能够同时用static和const进行修饰?

    答: 不能,因为static修饰之后,变为静态成员函数,他是属于类本身,不属于那个类的对象。而const修饰的是类的成员函数

    用C实现函数重载

    答:用可变参数列表,另外两种用 C 实现函数重载的方法可以是利用宏和预处理,以及函数指针,只不过具体的重载方式也要根据特定的应用场景来决定 如何实现 C 的函数重载

    C实现继承

    答:用C语言实现继承一般有2种方法:声明放在结构中,声明在结构外。另外还有一种方法是:用宏定义出C++ C语言面向对象编程(一):封装与继承 C语言面向对象编程(二):继承详解

    C实现多态

    答:通过函数指针 C语言面向对象编程(三):虚函数与多态

    智能指针相关

    1.智能指针是什么

    答:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。

    转载请注明原文地址: https://ju.6miu.com/read-1295441.html
    最新回复(0)