-
C++中的引用和指针有什么区别?
- 引用:
- 是变量的别名,一旦绑定就无法更改。
- 不能为null,必须在定义时初始化。
- 使用方便,语法类似直接访问变量。
- 指针:
- 是一个变量,存储另一个变量的内存地址。
- 可以为null,指向不同对象。
- 可以进行算术运算,如指针加减。
- 引用:
-
什么是RAII(资源获取即初始化)?
- RAII是一种管理资源(如内存、文件句柄等)的技术。资源在对象创建时获取,并在对象销毁时自动释放。典型的实现方式是使用构造函数和析构函数。
-
C++中的智能指针有哪些?各自的特点是什么?
- std::unique_ptr:独占所有权,不允许复制,生命周期结束时自动释放资源。
- std::shared_ptr:共享所有权,多方可以共享同一资源,引用计数为0时自动释放资源。
- std::weak_ptr:与std::shared_ptr配合使用,不增加引用计数,用于解决循环引用问题。
-
什么是内存对齐?如何影响性能?
- 内存对齐是指将数据放置在满足特定边界要求的内存地址上。对齐可以提高CPU的访问效率,减少读取和写入的操作次数,提高性能。
-
C++中的const关键字有什么用?可以修饰哪些内容?
- 常量修饰:const用于修饰变量,使其不可修改。
- 指针修饰:可以修饰指针自身或指针指向的内容。
- 成员函数修饰:const成员函数不能修改成员变量。
- 函数参数修饰:用于避免函数内部修改参数值。
-
解释一下什么是多重继承及其潜在问题。
- 多重继承指一个类同时继承自多个基类。潜在问题包括:
- 菱形继承:导致基类的多次拷贝,引发不确定性。
- 命名冲突:不同基类中同名成员的冲突。
- 多重继承指一个类同时继承自多个基类。潜在问题包括:
-
C++中如何实现接口?与Java的接口有什么区别?
- C++中通过纯虚函数(=0)的抽象类实现接口。
- 与Java不同,C++中接口可以有数据成员和非虚函数,并支持多重继承。
-
什么是模板元编程?
- 模板元编程(Template Metaprogramming)是在编译期间通过模板进行计算和代码生成的编程技术,常用于实现高效、通用的算法和数据结构。
-
解释一下C++中的异常处理机制。
- C++通过
try
、catch
和throw
关键字实现异常处理。try
块中放置可能抛出异常的代码,catch
块中捕获异常并处理,throw
用于抛出异常。
- C++通过
-
C++中如何防止对象被拷贝?
- 通过删除拷贝构造函数和拷贝赋值运算符,或将其设为private或protected。
- 在C++11及更高版本中可以使用
=delete
来防止拷贝。
-
说说C++中的访问控制(public, protected, private)。
- public:公共成员,类的外部可以访问。
- protected:保护成员,派生类可以访问,类的外部不能访问。
- private:私有成员,仅类自身可以访问。
-
C++中的友元函数和友元类有什么用?
- 友元函数和友元类可以访问类的私有成员。它们用于实现需要在多个类之间共享访问权限的操作。
-
什么是析构函数?它的作用是什么?
- 析构函数在对象生命周期结束时自动调用,用于释放对象占用的资源,如内存、文件句柄等。
-
C++中如何实现单例模式?
- 通过私有化构造函数和拷贝构造函数,提供一个静态方法获取唯一实例。常用的实现方式包括懒汉式和饿汉式单例。
-
解释一下C++中的命名空间。
- 命名空间用于组织代码,避免命名冲突。通过
namespace
关键字定义,使用时可以通过::
访问或使用using
声明。
- 命名空间用于组织代码,避免命名冲突。通过
-
C++中的类型推导有什么用?如何使用?
- 类型推导允许编译器自动推导变量类型,减少代码冗余,常用关键字是
auto
和decltype
。
- 类型推导允许编译器自动推导变量类型,减少代码冗余,常用关键字是
-
讲一下C++中的字符串处理(如std::string)。
std::string
是C++标准库提供的字符串类,支持动态长度管理和丰富的字符串操作,如拼接、查找、替换等。
-
C++中的虚函数表(vtable)是什么?
- 虚函数表是实现动态多态的机制。每个含有虚函数的类都有一张虚函数表,存储该类的虚函数指针。对象通过vtable调用实际的虚函数实现。
-
解释一下C++中的默认参数。
- 默认参数是在函数声明中指定的默认值,如果调用时未传递该参数,使用默认值。可以减少函数重载的数量。
-
C++中的类型转换有哪些方式?
- static_cast:用于基本类型转换、隐式转换的显式表达、向上转换等。
- dynamic_cast:用于指针或引用的安全向下转换,需有虚函数。
- const_cast:用于去掉或添加
const
属性。 - reinterpret_cast:用于不安全的强制类型转换,通常在指针之间。
-
说说C++中的运算符重载的注意事项。
- 重载运算符时应保持语义清晰,遵循常规运算符的行为。
- 避免重载运算符的副作用,以免引起混淆。
- 不允许重载某些运算符,如
::
、.
、.*
和?:
。
-
C++中的动态多态和静态多态有什么区别?
- 动态多态:通过虚函数和继承实现,在运行时决定实际调用的函数。
- 静态多态:通过模板和函数重载实现,在编译时确定调用的函数。
-
C++中的std::move和std::forward有何区别?
- std::move:将对象强制转换为右值引用,常用于实现移动语义。
- std::forward:用于保持参数的左值或右值属性,常用于转发函数模板参数。
-
解释一下C++中的lambda表达式的使用场景。
- Lambda表达式用于定义匿名函数,常用于STL算法、回调函数、并发编程等场景,简化代码、提高可读性。
-
C++中的std::bind和std::function有什么用?
- std::bind:将函数及其参数绑定成一个可调用对象。
- std::function:是一个通用的函数封装器,可以存储任意可调用对象(函数、lambda、bind结果等)。
-
C++中的范围for循环是如何实现的?
- 范围for循环使用容器的
begin()
和end()
函数遍历元素,其底层是通过迭代器实现的。
- 范围for循环使用容器的
-
C++中的std::optional是什么?有什么用?
std::optional
是一个模板类,用于表示可能为空的对象,避免使用nullptr
或异常来表示无效值。
-
讲一下C++11中的线程库的基本使用。
- C++11提供了标准线程库,包含
std::thread
用于创建线程,std::mutex
用于线程同步,std::future
和std::promise
用于线程间通信。
- C++11提供了标准线程库,包含
-
C++中的volatile关键字有什么作用?
volatile
指示编译器不对变量进行优化,确保每次访问都直接从内存读取。常用于多线程编程和硬件寄存器编程。
-
C++中的static_assert有什么用?
static_assert
在编译时检查表达式是否为true,通常用于模板编程中进行类型检查和条件限制。
08-14
661
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)