C++基础语法面试题
C++中的引用和指针有什么区别?
答案:
- 定义方式不同 引用是变量的别名,定义时必须初始化:int& ref = var;指针是存储地址的变量,可以不初始化:int* ptr;
- 是否可以为空 引用不能为空,必须绑定到一个对象指针可以为空(nullptr),可以不指向任何对象
- 是否可以改变指向 引用一旦绑定就不能改变指向指针可以随时改变指向不同的对象
- 内存占用 引用不占用额外内存(编译器优化)指针需要占用内存存储地址(32位系统4字节,64位系统8字节)
- 使用方式 引用使用时和普通变量一样:ref = 10;指针需要解引用:*ptr = 10;
- const关键字的作用有哪些?
答案:
- 修饰变量 定义常量,不可修改:const int MAX = 100;保护数据不被意外修改
- 修饰指针 常量指针:const int* ptr; 指向的内容不可变指针常量:int* const ptr; 指针本身不可变常量指针常量:const int* const ptr; 都不可变
- 修饰函数参数 防止函数内部修改参数:void func(const int& param);提高效率,避免拷贝大对象
- 修饰成员函数 表示该函数不会修改成员变量:int getValue() const;const对象只能调用const成员函数
- 修饰返回值 防止返回值被修改:const string& getName();
- static关键字的作用有哪些?
答案:
- 修饰局部变量 延长生命周期到程序结束只初始化一次,保持上次的值存储在静态存储区
- 修饰全局变量/函数 限制作用域在当前文件内实现文件级别的封装避免命名冲突
- 修饰类成员变量 所有对象共享同一份数据不属于某个具体对象必须在类外初始化
- 修饰类成员函数 不需要对象即可调用:ClassName::staticFunc();只能访问静态成员变量和静态成员函数没有this指针
- C++中的四种类型转换是什么?
答案:
- static_cast 用于基本数据类型转换:int a = static_cast<int>(3.14);用于有继承关系的类指针转换(向上转换安全)编译时检查,相对安全
- dynamic_cast 用于多态类型的安全向下转换运行时类型检查,失败返回nullptr(指针)或抛异常(引用)需要虚函数表支持(RTTI)
- const_cast 用于去除const属性:const_cast<int*>(const_ptr);唯一能改变const属性的转换谨慎使用,可能导致未定义行为
- reinterpret_cast 用于不相关类型的强制转换重新解释内存中的二进制位最不安全,仅在必要时使用
- 什么是左值和右值?什么是右值引用?
答案:
- 左值(lvalue) 可以取地址的表达式有持久性,生命周期较长例如:变量、数组元素、返回引用的函数调用
- 右值(rvalue) 不能取地址的临时对象生命周期短暂,表达式结束后销毁例如:字面量、临时对象、返回值的函数调用
- 右值引用(&&) C++11引入,用于绑定右值:int&& rref = 10;支持移动语义,避免不必要的拷贝实现完美转发
- 移动语义的优势 提高性能,减少深拷贝转移资源所有权而非复制配合移动构造函数和移动赋值运算符使用
- new和malloc的区别是什么?
答案:
- 本质区别 new是C++运算符,malloc是C库函数new由编译器支持,malloc需要包含头文件
- 返回类型 new返回具体类型指针,类型安全malloc返回void*,需要强制类型转换
- 分配失败处理 new失败抛出bad_alloc异常malloc失败返回nullptr
- 是否调用构造函数 new会调用构造函数初始化对象malloc只分配内存,不初始化
- 大小计算 new自动计算大小:new int[10];malloc需要手动计算:malloc(10 * sizeof(int));
- 释放方式 new对应delete/delete[]malloc对应free
- 是否可以重载 new可以重载malloc不能重载
- 什么是内存泄漏?如何避免?
答案:
- 内存泄漏定义 动态分配的内存没有被释放程序无法再访问该内存导致可用内存逐渐减少
- 常见原因 new后忘记delete异常导致delete未执行指针重新赋值前未释放原内存循环引用导致无法释放
- 避免方法 使用智能指针(shared_ptr、unique_ptr)RAII原则(资源获取即初始化)配对使用new/delete使用容器代替原始数组使用内存检测工具(Valgrind、AddressSanitizer)
- 什么是RAII?
答案:
- RAII定义 Resource Acquisition Is Initialization资源获取即初始化C++的重要编程技术
- 核心思想 在构造函数中获取资源在析构函数中释放资源利用对象生命周期管理资源
- 优势 自动管理资源,防止泄漏异常安全,析构函数总会被调用代码简洁,减少手动管理
- 典型应用 智能指针(unique_ptr、shared_ptr)文件流(fstream)互斥锁(lock_guard、unique_lock)自定义资源管理类
- inline函数的作用和限制是什么?
答案:
- 作用 建议编译器将函数代码内联展开减少函数调用开销提高执行效率
- 适用场景 函数体小,频繁调用性能关键路径类内定义的成员函数默认inline
- 限制 只是建议,编译器可能不采纳递归函数通常不会内联包含循环、switch的复杂函数不适合增加代码体积
- 与宏的区别 inline有类型检查,宏没有inline可以调试,宏不能inline遵循作用域规则inline更安全
- 什么是函数重载?重载的规则是什么?
答案:
- 函数重载定义 同一作用域内,函数名相同但参数不同编译器根据参数类型和个数选择调用哪个函数C++的多态性体现之一
- 重载规则 参数个数不同参数类型不同参数顺序不同(类型不同时)必须在同一作用域
- 不能重载的情况 仅返回类型不同仅const修饰不同(非成员函数)typedef定义的类型别名
- 重载解析 精确匹配优先类型提升匹配标准转换匹配用户定义转换匹配匹配失败或二义性则编译错误
百度成长空间 585人发布
