• C++常考面试题(第一篇)


    【题目 1】浅谈你对 C 和 C++的理解?

    1)C 语言面向过程,C++是面向对象的语言
    2)C++语句是对 C 语言的扩充和包含

     【题目 2】引用和指针有什么区别?或引用的特点?  

    引用的特点:1.引用不能单独存在(必须初始化)int num = 1; int& ref = num ;
    2. 引用不可以改变指向 int num2 = 5; ref = num2;赋值操作--》 num 变成 5
    3. 普通的引用,不可以用常量或者临时值初始化 int& ref = 4;错误的
    区别:
    引用是一个变量的别名,指针是一个变量,存的另一个变量的地址。
    1.引用不能为空引用,指针可以是空指针。
    2.引用赋值之后不可以改变指向,指针可以改变。
    3.引用不能单独存在,指针可以。
    引用必须进行初始化,指针可以随时初始化。

    【题目 3】将“引用”作为函数的参数有哪些特点

    void fun(int& num);不需要开辟新空间
    void fun(int num); 需要生成一个临时的新变量
    void fun(int* p); 指针变量需要空间的
    1.传递指针和引用的相同点:都可以实现对传递过来的实参本身进行操作。
    不同:
    参数类型为引用和值传递:
    值传递:需要为形参分配新空间,并且和原变量不是同一个变量
    引用传递:没有新变量的生成,没有新空间分配
    指针传递:和引用达到相同的效果,指针变量需要新空间,并且指针在代码可读性上,稍差一点
    fun(&num); *p,引用操作更直观。

    【题目 4】什么是常引用?常引用有什么作用

    const int& ref = num;
    const int& ref = 4;
    特点:可以使用常量或者临时值初始化
    1.常引用的引入主要是为了避免使用变量的引用时, 在不知情的情况下改变变量的值。
    2.常引用常作为函数的传入形参, 避免实参在调用函数中被意外的改变。
    void fun(const int& ref)只读的
    {
    //函数内不可以通过小名改变原变量的值,间接保护原变量
    ref = 80;错误的
    }

    【题目 5】函数参数传递中值传递、地址传递、引用传递有什么区别?

    1.值传递,形参的改变不影响实参,形参和实参只是将值传递过去,实际上地址还是两块地址,所以改变其中 一个,不会影响另一个。
    2.地址传递,形参的改变会影响实参,形参中存的是实参的地址,改变形参中的值,实际上是改变它存的那块地址里的值。
    3.引用传递,形参的改变也会影响实参, 形参是实参的别名,形参和实参是同一个地址,所以改变一个必然 会影响另一个。

    【题目 6】c++中,static 关键字有什么作用?

    类中的静态成员变量和静态成员函数。
    静态成员变量:
    1. 类的内部成员用 static 进行修饰后,变为静态成员; 
    2. 所有该类的对象共享这一块内存,静态成员不建议使用对象对象进行调用,可以直接通过类名进行调用。
    3.静态成员变量必须在类外声明,若未初始化则为默认值,给静态变量分配空间。
    成员函数:
    静态成员函数:1.没有 this 指针,所有只能访问静态成员变量; 2.只能调用静态成员函数。

     

    【题目 7】const 关键字有什么作用?

    const 修饰之后变为“只读”。
    变量被 const 修饰变为常量,值被初始化后,不能再修改。
    在 c++中,常用于修饰函数和对象。
    常函数:const 修饰在形参列表的后面,常函数中的成员变量不能被修改。
    void show() const { 不可以改变类中成员变量的值 }
    常对象:对象中的成员属性不能被修改;只能调用常函数;
    const person a;
    常引用:引用中的属性值不能被修改; 可以用常量进行初始化。

    【题目 8】描述一下常函数与常对象?

    常函数 const 修饰在形参列表的后面,常函数中的成员变量不能被修改。
    常对象 const 可以修饰在类的前面或类的后面,1)对象中的成员属性不能被修改 2)只能调用常函数。

    【题目 9】c++中如何打破 const 的限制?

    使用 mutable 关键字
    class A
    {
    mutable int num;
    public:
            void fun() const      //常函数不可以修改成员的值
            {
                    num++;//正确的
            }
    };

    【题目 10】const 和#define 定义常量有什么区别 (谁更安全)

    1. define 宏是在预处理阶段展开。const 常量是在编译运行阶段使用
    2. 宏没有类型,不做任何类型检查,仅仅是展开。
    const 常量有具体的类型,在编译阶段会执行类型检查,所有 const 更安全。
    3.define 宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
    const 常量会在内存中分配(可以是堆中也可以是栈中)

    【题目 11】C++中结构体(struct)和类(class)有什么区别?

    1.成员的默认访问权限:struct 为 public,class 为 private
    2.习惯用法:复杂逻辑写在 class 类中,较小体量的,结点等,用结构体
    3.默认的继承权限:struct 为 public 继承,class 为 private 继承

    【题目 12】如何格式化输出 bool 类型的值?

    在打印输出 bool 变量前使用 boolalpha 转换,使用 noboolalpha 解除转换。
    cout << boolalpha << true << noboolalpha << endl;

    【题目 13】构造函数是什么?有哪些特点?

    格式:函数名和类名相同,没有返回值,可以有参数
    调用时机:创建对象时,自动调用的函数
    什么时候有默认的构造函数?作用是什么?
    类中没有显示的定义构造函数,会存在默认的构造, 没有参数,没有逻辑
    class person
    {};

    【题目 14】析构函数是什么?有哪些特点?

    ~person( ){ }
    析构函数是在对象自动销毁时被系统调用的函数,作用是释放对象中开辟的内存空间,防止内存泄漏。
    析构函数没有返回类型,函数名为~加类名,没有形参列表,不能被重载(每个类中只能有一个析构函数)。

    【题目 15】有了 malloc/free,为什么还要 new/delete?

    相同点:它们都可用于申请动态内存和释放内存。
    不同点:1)malloc 与 free 是 C++/C 语言的标准库函数;
    new/delete 是 C++的运算符,关键字。
    2)new 申请的空间,直接进行初始化;
    malloc 申请的空间没有类型,void*,需要进行强制类型转换。
    补充:person* p = new person; //调用 person 类的无参构造
    person* operator new (person)
    {
    malloc 堆空间申请空间
    调用 person 的构造函数
    return person*
    }
    对象 在创建的时候,要自动调用构造函数,对象在消亡之前要自动执行析构函数。
    由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务。
    因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。

    结语

    以上就是一些C++面试题,本次C++知识分享到此结束,后续还会发有关C++面试题。

    最后的最后,还请大家点点赞,点点关注,谢谢大家!

  • 相关阅读:
    2023年辽宁省数学建模竞赛C题用科幻思维研究智能化战争指挥决策
    Linux 指令心法(十七)`nandwrite` 写入NAND闪存设备
    mediasoup编译之ios端
    如何通过 Hardhat 来验证智能合约
    Flink 数据交换策略 Partitioner
    MySql 约束
    PyQt5桌面应用启动模板
    【ybtoj】二分算法例题
    鸿蒙开发HarmonyOS4.0入门与实践
    机器学习之旅-从Python 开始
  • 原文地址:https://blog.csdn.net/m0_74055118/article/details/137696278