当前位置: 首页 > news >正文

C++面试题及详细答案100道( 01-10 )

前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

文章目录

  • 一、本文面试题目录
      • 1. 什么是C++中的引用?引用和指针有什么区别?
      • 2. 解释C++中的`const`关键字的作用。
      • 3. 什么是函数重载(Function Overloading)?
      • 4. 解释C++中的`static`关键字在不同场景下的作用。
      • 5. 什么是构造函数和析构函数?它们的作用是什么?
      • 6. 什么是深拷贝和浅拷贝?如何避免浅拷贝的问题?
      • 7. 解释C++中的`virtual`关键字的作用。
      • 8. 什么是C++中的RAII(资源获取即初始化)原则?
      • 9. 解释C++中的模板(Template)的概念。
      • 10. 什么是C++中的异常处理机制?
  • 二、100道面试题目录列表

一、本文面试题目录

1. 什么是C++中的引用?引用和指针有什么区别?

答案
引用是变量的别名,必须在声明时初始化,且不能重新绑定到其他变量。指针是存储内存地址的变量,可以在任何时候被赋值或重新赋值。

主要区别

  • 引用必须初始化,指针可以不初始化。
  • 引用不能为nullptr,指针可以指向nullptr
  • 引用一旦绑定不能更改,指针可以随时指向其他对象。
  • 引用使用&声明,指针使用*声明。

示例代码

int main() {int x = 10;int& ref = x;  // 引用必须初始化ref = 20;      // x 现在是20int* ptr = &x; // 指针存储x的地址*ptr = 30;     // x 现在是30int y = 40;ptr = &y;      // 指针可以重新赋值// ref = y;    // 错误:引用不能重新绑定
}

2. 解释C++中的const关键字的作用。

答案
const用于声明不可修改的变量或对象。其作用包括:

  1. 常量变量:值不可修改。
  2. 常量指针:指向常量的指针或常量指针。
  3. 常量成员函数:保证不修改对象的状态。
  4. 常量引用:防止函数内部修改引用的对象。

示例代码

const int a = 10;     // 常量变量
// a = 20;           // 错误:不能修改常量int b = 20;
const int* ptr1 = &b; // 指向常量的指针(不能通过ptr1修改b)
// *ptr1 = 30;       // 错误
ptr1 = &a;            // 但可以指向其他常量int* const ptr2 = &b; // 常量指针(必须初始化,不能重新赋值)
*ptr2 = 30;           // 可以修改指向的值
// ptr2 = &a;        // 错误:不能重新赋值class MyClass {int value;
public:int getValue() const { // 常量成员函数// value = 100;    // 错误:不能修改成员变量return value;}
};

3. 什么是函数重载(Function Overloading)?

答案
函数重载允许在同一作用域内定义多个同名函数,但参数列表必须不同(参数类型、数量或顺序不同)。编译器根据调用时的实参类型和数量来决定使用哪个重载版本。

示例代码

int add(int a, int b) { return a + b; }         // 版本1
double add(double a, double b) { return a + b; } // 版本2
int add(int a, int b, int c) { return a + b + c; } // 版本3int main() {int x = add(1, 2);         // 调用版本1double y = add(1.5, 2.5);  // 调用版本2int z = add(1, 2, 3);      // 调用版本3
}

4. 解释C++中的static关键字在不同场景下的作用。

答案
static在C++中有多种用途:

  1. 静态全局/局部变量

    • 全局变量:限制作用域为当前文件(内部链接)。
    • 局部变量:延长生命周期至程序结束,只初始化一次。
  2. 静态类成员

    • 静态成员变量:所有对象共享同一个实例。
    • 静态成员函数:不依赖于对象,可以直接通过类名调用。

示例代码

// 静态全局变量
static int globalVar = 10; // 仅在当前文件可见void func() {static int count = 0; // 只初始化一次count++;cout << count << endl;
}class MyClass {
public:static int sharedValue; // 静态成员变量static void printMsg() { // 静态成员函数cout << "Static function" << endl;}
};int MyClass::sharedValue = 0; // 必须在类外初始化int main() {func(); // 输出1func(); // 输出2MyClass::sharedValue = 100; // 直接通过类名访问MyClass::printMsg();        // 直接调用静态函数
}

5. 什么是构造函数和析构函数?它们的作用是什么?

答案

  • 构造函数:与类同名的特殊成员函数,用于初始化对象。可以重载,允许有参数。
  • 析构函数:与类同名但前加~的特殊成员函数,用于在对象销毁时释放资源(如内存、文件句柄等)。不可重载,无参数。

示例代码

class Resource {
private:int* data;
public:// 构造函数Resource(int size) {data = new int[size]; // 分配内存cout << "Resource created" << endl;}// 析构函数~Resource() {delete[] data; // 释放内存cout << "Resource destroyed" << endl;}
};int main() {Resource res(10); // 构造函数被调用// res在作用域结束时自动调用析构函数
}
No.大剑师精品GIS教程推荐
0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】
1Openlayers 【入门教程】 - 【源代码+示例 300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3MapboxGL【入门教程】 - 【源代码+图文示例150+】
4Cesium 【入门教程】 - 【源代码+综合教程 200+】
5threejs【中文API】 - 【源代码+图文示例200+】
6Shader 编程 【图文示例 100+】

6. 什么是深拷贝和浅拷贝?如何避免浅拷贝的问题?

答案

  • 浅拷贝:只复制对象的成员变量值(包括指针),不复制指针指向的内存。多个对象共享同一块内存,可能导致双重释放问题。
  • 深拷贝:复制对象时,为指针成员分配新的内存并复制内容,避免共享内存。

示例代码

class MyClass {
private:int* data;int size;
public:// 默认构造函数MyClass(int s) : size(s) {data = new int[size];}// 深拷贝构造函数MyClass(const MyClass& other) : size(other.size) {data = new int[size];for (int i = 0; i < size; ++i) {data[i] = other.data[i]; // 复制内容}}// 析构函数~MyClass() {delete[] data;}
};

7. 解释C++中的virtual关键字的作用。

答案
virtual主要用于实现多态(运行时绑定):

  1. 虚函数:基类中声明的虚函数,允许派生类重写。通过基类指针或引用调用时,根据对象实际类型决定执行哪个版本。
  2. 虚析构函数:确保通过基类指针删除派生类对象时,正确调用派生类的析构函数。
  3. 虚基类:解决菱形继承中的数据冗余问题。

示例代码

class Shape {
public:virtual void draw() { cout << "Shape" << endl; } // 虚函数virtual ~Shape() { cout << "Shape destructor" << endl; } // 虚析构函数
};class Circle : public Shape {
public:void draw() override { cout << "Circle" << endl; } // 重写虚函数~Circle() override { cout << "Circle destructor" << endl; }
};int main() {Shape* shape = new Circle();shape->draw(); // 输出"Circle"(运行时多态)delete shape;  // 正确调用Circle的析构函数
}

8. 什么是C++中的RAII(资源获取即初始化)原则?

答案
RAII是C++的核心设计模式,通过对象生命周期管理资源:

  • 资源获取:在构造函数中分配资源(如内存、文件句柄)。
  • 资源释放:在析构函数中自动释放资源。

示例代码

#include <fstream>class FileHandler {
private:std::fstream file;
public:FileHandler(const std::string& filename) : file(filename, std::ios::in) {if (!file.is_open()) {throw std::runtime_error("Failed to open file");}}~FileHandler() {if (file.is_open()) {file.close(); // 自动关闭文件}}// 其他文件操作方法
};

9. 解释C++中的模板(Template)的概念。

答案
模板是C++的泛型编程机制,允许编写与类型无关的代码。主要分为:

  1. 函数模板:生成重载函数集。
  2. 类模板:生成类族。

示例代码

// 函数模板
template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}// 类模板
template <typename T, int Size>
class Array {
private:T data[Size];
public:T& operator[](int index) { return data[index]; }
};int main() {int x = max(1, 2);         // 使用函数模板Array<double, 5> arr;      // 使用类模板arr[0] = 3.14;
}

10. 什么是C++中的异常处理机制?

答案
C++的异常处理通过trycatchthrow实现:

  • throw:抛出异常对象。
  • try:包裹可能抛出异常的代码块。
  • catch:捕获并处理特定类型的异常。

示例代码

#include <stdexcept>double divide(double a, double b) {if (b == 0) {throw std::runtime_error("Division by zero"); // 抛出异常}return a / b;
}int main() {try {double result = divide(10, 0);} catch (const std::runtime_error& e) {std::cout << "Error: " << e.what() << std::endl; // 捕获异常}
}

二、100道面试题目录列表

文章序号C++面试题100道
1C++面试题及详细答案100道(01-10)
2C++面试题及详细答案100道(11-20)
3C++面试题及详细答案100道(21-30)
4C++面试题及详细答案100道(31-40)
5C++面试题及详细答案100道(41-50)
6C++面试题及详细答案100道(51-60)
7C++面试题及详细答案100道(61-70)
8C++面试题及详细答案100道(71-80)
9C++面试题及详细答案100道(81-90)
10C++面试题及详细答案100道(91-100)
http://www.lryc.cn/news/610394.html

相关文章:

  • mongodb源代码分析创建db流程分析
  • 【论文阅读】ACE: Explaining cluster from an adversarial perspective
  • Makefile文件写法模板
  • 数据与模型优化随机森林回归进行天气预测
  • CLM陆面过程模式实践技术应用
  • 攻防世界-Mobile-easyjni
  • 8.高斯混合模型
  • 基于Springboot+Mybatis+thymeleaf的个人博客系统的设计与实现
  • 监控插件(二)prometheus(2)API CounterGauge
  • Linux下PXE服务器搭建
  • EdgeView for macOS:解决图像管理痛点的利器
  • 【BUUCTF系列】[极客大挑战 2019]LoveSQL 1
  • Scrapy爬虫集成MongoDB存储
  • FinalShell 跳板机proxyjump使用
  • Go 与 Python 爬虫代码实操对比
  • Python接口自动化测试之之request
  • SpringMvc跨域配置方法详解
  • Jmeter进行性能并发测试
  • 设计模式-创建型-工厂模式
  • Clion STM32CubeMX LED闪灯
  • CentOS卸载、安装MySQL8(yum操作)
  • 【QT】常⽤控件详解(三)常用按钮控件PushButton RadioButton CheckButton Tool Button
  • Kali基础知识点【2】
  • 查看 Java 字节码文件:jclasslib 的使用
  • C++高频知识点(十四)
  • 文件包含篇
  • Linux中netstat详细使用指南
  • MySQL偏门但基础的面试题集锦
  • webm 读取解析
  • 并发编程常用工具类(上):CountDownLatch 与 Semaphore 的协作应用