C++八股文(基础知识篇1)

1. C++ 和 C 有什么区别?

C++是C语言的超集,主要区别在于:

  • 编程范式:C是面向过程的,C++支持面向对象、泛型编程和函数式编程
  • 核心特性:C++增加了类、继承、多态、封装、模板、异常处理、命名空间等
  • 内存管理:C用malloc/free,C++用new/delete,并支持构造/析构函数自动管理资源
  • 类型检查:C++的类型检查更严格
  • 标准库:C++有STL容器、算法和迭代器,功能更强大

2. 引用(Reference)与指针(Pointer)有什么区别?

  • 初始化:引用必须在定义时初始化,指针可以先声明后赋值
  • 重新绑定:引用一旦绑定不能改变,指针可以指向不同对象
  • 空值:引用不能为空,指针可以是nullptr
  • 语法:引用使用更简洁,像操作原变量一样;指针需要解引用操作
  • 内存:引用通常不占额外空间(编译器优化),指针占用内存存储地址
  • 使用场景:引用常用于函数参数传递,指针更灵活,适合动态内存和数据结构

3. 深拷贝与浅拷贝有什么区别?

  • 浅拷贝:只复制对象的值,如果有指针成员,只复制指针地址,不复制指针指向的内容。多个对象共享同一块内存,析构时会导致重复释放
  • 深拷贝:不仅复制对象的值,还会为指针成员重新分配内存并复制内容。每个对象独立管理自己的资源
  • 默认行为:编译器生成的默认拷贝构造函数和赋值运算符执行浅拷贝
  • 何时需要深拷贝:当类中有指针成员、动态分配的资源时,需要自定义深拷贝

4. 什么是构造函数和析构函数?

  • 构造函数:对象创建时自动调用,用于初始化对象。函数名与类名相同,无返回值。可以重载,支持默认参数和初始化列表
  • 析构函数:对象销毁时自动调用,用于清理资源(释放内存、关闭文件等)。函数名是~加类名,无参数无返回值,不能重载
  • 调用时机:栈对象离开作用域时、delete堆对象时、程序结束时全局对象销毁
  • 虚析构函数:基类析构函数应该是虚函数,确保通过基类指针删除派生类对象时正确调用析构函数

5. 如何定义常量(const)?

  • 常量变量const int MAX = 100; 必须初始化,不能修改
  • 常量指针const int* p 指向常量,不能通过p修改值;int* const p 指针本身是常量,不能改变指向
  • 常量引用const int& ref = value; 常用于函数参数,避免拷贝且防止修改
  • 常量成员函数void func() const; 承诺不修改成员变量,可被常量对象调用
  • 编译期常量constexpr int SIZE = 10; C++11引入,编译时求值

6. new 和 delete 是如何工作的?

  • new的工作:①分配内存(调用operator new)②调用构造函数初始化对象③返回指向对象的指针
  • delete的工作:①调用析构函数②释放内存(调用operator delete)
  • 数组形式new[] 分配数组,delete[] 释放数组,必须配对使用
  • 失败处理:new失败抛出bad_alloc异常,可用nothrow版本返回nullptr
  • 与malloc/free区别:new/delete会调用构造/析构函数,malloc/free只管理内存

7. sizeof 和 alignof 的作用是什么?

  • sizeof:编译期运算符,返回类型或对象占用的字节数。对数组返回总大小,对指针返回指针本身大小(通常4或8字节)
  • alignof:C++11引入,返回类型的对齐要求(字节数)。CPU访问对齐的数据更高效
  • 结构体大小:受内存对齐影响,可能有填充字节,不是简单的成员大小相加
  • 使用场景:sizeof常用于内存分配、数组元素计数;alignof用于底层内存布局优化

8. 默认构造函数和拷贝构造函数有什么区别?

  • 默认构造函数:无参数或所有参数都有默认值,用于创建对象。MyClass obj; 如果没定义任何构造函数,编译器会生成
  • 拷贝构造函数:参数是同类型对象的引用,用于用已有对象初始化新对象。MyClass obj2(obj1);MyClass obj2 = obj1;
  • 调用时机:拷贝构造在对象作为函数参数传递、函数返回对象、用对象初始化另一对象时调用
  • 编译器生成:如果不定义,编译器会生成默认版本,执行成员逐个拷贝

9. const 关键字的用途是什么?

  • 定义常量:防止变量被修改,提高代码安全性
  • 函数参数void func(const string& str) 避免拷贝开销且保证不修改实参
  • 成员函数int getValue() const 表明不修改对象状态,常量对象只能调用const成员函数
  • 返回值const int* getPtr() 防止返回值被修改
  • 编译优化:编译器可以对const进行优化,提高性能
  • 接口设计:明确表达设计意图,增强代码可读性和可维护性

10. 如何使用 static 关键字?

  • 静态局部变量:函数内的static变量只初始化一次,生命周期是整个程序,但作用域仅在函数内
  • 静态全局变量/函数:限制作用域在当前文件,实现文件级封装,避免命名冲突
  • 静态成员变量:属于类而非对象,所有对象共享,必须在类外初始化
  • 静态成员函数:不依赖具体对象,只能访问静态成员,通过类名调用
  • 使用场景:单例模式、计数器、工厂方法、工具函数等

全部评论

相关推荐

2025-12-23 11:48
南昌大学 Java
快手商业化(品牌营销) Java开发实习生12.11投递 12.13状态->面试 12.15约一面 12.17一面 12.18约二面 12.22二面 当天发感谢信一面(1h):自我介绍可以简单介绍一下项目么?整个的流程是怎么样的?项目中你使用到了Redis和MySQL,会不会出现Redis扣减了库存,但是MySQL却没有扣减的情况呢,是怎么去解决的?看到你项目中用了注解去限流,那么你来介绍一下Java中的注解吧你觉得我们项目中建表应该要考虑一些什么呢?B+树听你说是一个不超过3层的矮胖类型的数据结构,那么为什么你说他的时间复杂度是O(log n)呢,不应该是常数级别的么?手撕 lc 25.k个一组翻转链表反问 面试评价以及出结果时间二面(40min)无手撕 无八股自我介绍硕士是保送的还是考的呢?介绍一下自己的课题,可以给我用简单易懂的话,说明一下你现在做的课题对6G技术的发展能做出哪些贡献么?可以和我介绍一下你这一两年的有意思的事情么?你想到的都可以说你觉得上一段工作经历对你的最大的帮助在哪里?为什么选择放弃上一段正职工作呢,现在每年考研的人数都在下降,尤其是这家公司在这个领域还是头部,可能别人会觉得拿到了这么好的公司的offer,可以分享一下你是怎么想的么?你简历上面的两个项目我看都是传统的Java工程,现在AI大模型非常火爆,有没有想过往这个方向学习?这两个项目我觉得重合度有一些高,那么你可以说说两个项目你分别侧重在那一块么?除开重合的部分你觉得引入了异步队列,把时延从800ms降低到150ms,那么在工程中,我认为这个时延其实是可以做到两位数的,那么可以分析一下这150ms具体是分布在哪些环节么,数据库连接池或者DNS这些可能就20ms就搞定了,那么还有哪些地方是耗时较高的呢?(这个问题面试官一直在引导思考,但是确实没有具体去看过哪些地方的耗时高)反问 组内业务以及出结果时间
查看14道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务