您现在的位置是:首页 >技术教程 >C/C++ 面试中常问道的问题网站首页技术教程

C/C++ 面试中常问道的问题

Cedric1113 2025-02-10 12:01:02
简介C/C++ 面试中常问道的问题

在 C/C++ 面试中,面试官通常会从基础知识、编程技能、项目经验等多个方面进行考察。以下为你详细介绍可能被问到的问题:

基础知识类

语言特性

  • 请简述 C 和 C++ 的区别:C 是面向过程的编程语言,主要关注功能的实现和数据的处理;C++ 是在 C 的基础上发展而来,支持面向对象编程,具有封装、继承、多态等特性,同时也兼容 C 语言的特性。
  • 什么是指针,指针和引用有什么区别:指针是一个变量,它存储的是另一个变量的内存地址;引用是一个变量的别名,它和所引用的变量共享同一块内存地址。指针可以为空、可以重新赋值指向其他对象,而引用必须在定义时初始化,且不能重新引用其他对象。
  • 解释一下 C++ 中的多态:多态是指在不同的继承关系的类对象中,调用同一函数名的函数,产生不同的行为。C++ 中的多态分为静态多态(函数重载、模板)和动态多态(虚函数)。动态多态通过基类指针或引用调用派生类的虚函数来实现。

内存管理

  • 在 C 和 C++ 中,分别如何进行内存分配和释放:在 C 语言中,使用malloccallocrealloc函数进行内存分配,使用free函数释放内存;在 C++ 中,除了可以使用 C 语言的内存分配方式外,还可以使用new运算符进行内存分配,使用delete运算符释放内存。对于数组,使用new[]delete[]
  • 什么是内存泄漏,如何避免:内存泄漏是指程序在运行过程中,动态分配的内存没有被正确释放,导致这部分内存无法被再次使用。避免内存泄漏的方法包括:确保在使用完动态分配的内存后及时释放;使用智能指针(如std::unique_ptrstd::shared_ptr)来管理动态内存;在异常处理中确保内存被正确释放。

面向对象编程

  • 解释一下封装、继承和多态的概念:封装是将数据和操作数据的函数捆绑在一起,隐藏对象的内部实现细节,只对外提供必要的接口;继承是指一个类可以继承另一个类的属性和方法,从而实现代码的复用和扩展;多态是指不同的对象对同一消息做出不同的响应。
  • 什么是虚函数和纯虚函数:虚函数是在基类中使用virtual关键字声明的函数,它允许在派生类中重写该函数。纯虚函数是在基类中声明的虚函数,并且没有具体的实现,其声明形式为virtual 函数返回类型 函数名(参数列表) = 0;。包含纯虚函数的类称为抽象类,抽象类不能实例化对象。

编程技能类

算法和数据结构

  • 请实现一个快速排序算法:快速排序是一种分治算法,其基本思想是选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后分别对左右两部分进行递归排序。

收起

cpp

#include <iostream>
#include <vector>

void quickSort(std::vector<int>& arr, int left, int right) {
    if (left < right) {
        int pivot = arr[right];
        int i = left - 1;
        for (int j = left; j < right; j++) {
            if (arr[j] <= pivot) {
                i++;
                std::swap(arr[i], arr[j]);
            }
        }
        std::swap(arr[i + 1], arr[right]);
        int partitionIndex = i + 1;

        quickSort(arr, left, partitionIndex - 1);
        quickSort(arr, partitionIndex + 1, right);
    }
}

int main() {
    std::vector<int> arr = {3, 6, 8, 10, 1, 2, 1};
    quickSort(arr, 0, arr.size() - 1);
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

  • 简述链表和数组的优缺点:数组的优点是可以随机访问元素,访问速度快;缺点是插入和删除元素的效率较低,且数组的大小在创建时就需要确定,不够灵活。链表的优点是插入和删除元素的效率较高,不需要预先分配固定大小的内存;缺点是不能随机访问元素,访问某个元素需要从头节点开始遍历,效率较低。

代码分析和调试

  • 分析下面代码的输出结果

收起

cpp

#include <iostream>
class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() {
        std::cout << "Derived::func()" << std::endl;
    }
};

int main() {
    Base* ptr = new Derived();
    ptr->func();
    delete ptr;
    return 0;
}

答案:输出结果为Derived::func()。因为func()是虚函数,通过基类指针调用派生类对象的虚函数时,会发生动态绑定,调用派生类中重写的函数。

项目经验类

  • 请介绍一下你参与过的 C/C++ 项目:在回答这个问题时,需要详细介绍项目的背景、目标、你在项目中承担的角色和主要工作、项目中遇到的问题及解决方案等。
  • 在项目中,你遇到的最大挑战是什么,你是如何解决的:可以结合具体的项目场景,说明遇到的技术难题、时间压力、团队协作等方面的挑战,并阐述你采取的解决方法和最终取得的成果。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。