std::move的作用是什么?它与右值引用有什么关系?
- 作用:将对象转换为右值引用,触发移动语义,避免不必要的深拷贝。
- 右值引用(T&&):用于标识临时对象或可被“移动”的资源。
- 示例:
std::string s1 = "Hello";
std::string s2 = std::move(s1); // s1的资源被移动到s2,s1变为空
C++中如何处理多线程数据竞争?
- 使用互斥锁(std::mutex)、原子操作(std::atomic)或线程安全容器。
- 示例:
std::mutex mtx;
int counter = 0;
void increment() {
std::lock_guard lock(mtx);
counter++;
}
什么是noexcept关键字?它的作用是什么?
- 作用:声明函数不会抛出异常,帮助编译器优化代码。
- 若标记为noexcept的函数抛出异常,程序会直接终止。
- 示例:
void func() noexcept {
// 保证不抛出异常
}
C++中的委托构造函数是什么?
- 作用:一个构造函数可以调用同一类的另一个构造函数,避免代码重复。
- 示例:
class MyClass {
public:
MyClass(int a) : x(a) {}
MyClass() : MyClass(0) {} // 委托给带参构造函数
private:
int x;
};
模板元编程是什么?举例说明。
- 目的:在编译期通过模板生成代码或进行计算。
- 示例:计算斐波那契数列:
template
struct Fibonacci {
static const int value = Fibonacci::value + Fibonacci::value;
};
template<> struct Fibonacci<0> { static const int value = 0; };
template<> struct Fibonacci<1> { static const int value = 1; };
// 编译期计算:Fibonacci<5>::value == 5
什么是类型推导(Type Deduction)?auto和decltype的区别?
- auto:根据初始化表达式推导变量类型。
- decltype:推导表达式的类型,保留引用和const限定符。
- 示例:
auto x = 10; // x的类型是int
decltype(x) y = x; // y的类型是int
const int& r = x;
decltype(r) z = x; // z的类型是const int&
解释std::forward的作用(完美转发)。
- 目的:在模板中保持参数的左值/右值属性,避免不必要的拷贝。
- 常用于通用引用(T&&)和转发函数参数。
- 示例:
template
void wrapper(T&& arg) {
func(std::forward(arg)); // 保持arg的左右值特性
}
C++中的虚函数表(vtable)是如何工作的?
- vtable:每个包含虚函数的类有一个虚函数表,存储虚函数指针。
- vptr:对象内部隐含的指针,指向其类的vtable。
- 调用虚函数时,通过vptr找到vtable,再通过偏移量调用具体函数。
什么是三法则(Rule of Three)?C++11后有何变化?
- 三法则:若定义了析构函数、拷贝构造函数或拷贝赋值运算符中的一个,通常需要定义全部三个。
- C++11后:扩展为五法则(新增移动构造函数和移动赋值运算符)。
解释constexpr关键字的作用。
- 目的:声明变量或函数在编译期求值,用于常量表达式。
- 示例:
constexpr int square(int x) { return x * x; }
int arr[square(3)]; // 编译期确定数组大小为9
什么是placement new?它的应用场景是什么?
- 作用:在已分配的内存上构造对象,不分配新内存。
- 场景:自定义内存池、避免频繁内存分配。
- 示例:
char buffer[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass(); // 在buffer上构造对象
obj->~MyClass(); // 需手动调用析构函数
C++中的friend关键字有什么作用?
- 作用:允许非成员函数或其他类访问当前类的私有成员。
- 示例:
class MyClass {
private:
int secret;
friend void friendFunc(MyClass& obj); // 友元函数
};
void friendFunc(MyClass& obj) {
obj.secret = 42; // 允许访问私有成员
}
解释C++的编译和链接过程。
- 编译:将源代码转换为目标文件(.obj/.o),包括预处理、编译、汇编。
- 链接:合并目标文件和库,解析符号引用,生成可执行文件。
- 常见错误:
- 编译错误:语法错误、类型不匹配。
- 链接错误:未定义的符号、重复定义。