当前位置:首页 > 技术分析 > 正文内容

C/C++面试题(四)

ruisui883个月前 (03-11)技术分析15

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),包括预处理、编译、汇编。
  • 链接:合并目标文件和库,解析符号引用,生成可执行文件。
  • 常见错误
    • 编译错误:语法错误、类型不匹配。
    • 链接错误:未定义的符号、重复定义。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2696.html

标签: ts void
分享给朋友:

“C/C++面试题(四)” 的相关文章

Excel VBA 收费单据打印/一步一步带你设计【收费管理系统】12

本文于2023年6月10日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!☆本期内容概要☆用户窗体设置:收费结算模块设置(7)单据打印大家好,我是冷水泡茶,前几期我们分享了【收费管理系统】的设计,最近一期是(Excel VBA 收费结算模块/一步一步带你设计【收费管理系统】11),...

Vue3 如何实现父子组件传值?

在Vue 3中,要实现父子组件传值效果主要通过props和emit两种机制来实现,下面我们就来详细介绍一下这两种机制。父组件向子组件传值propsprops是Vue组件的一种机制,主要的作用就是实现从父组件向子组件传递数据值,在父组件上通过在子组件标签上定义属性来实现数据属性值的传递,在子组件中通过...

用IDEA开发如何用Git快速拉取指定分支代码?

1,准备空的文件夹,git init2,关联远程仓库,git remote add origin gitlab地址3,拉取远程分支代码,git pull origin 远程分支名再用IDEA打开项目即可...

vue2中路由的使用步骤,你学会了吗?

今天我们来整理下关于vue2中路由的使用步骤:1. 导入 vue 文件和Vue-router文件(注意:vue-router是依赖vue运行的,所以一定在vue后引入vue-router)2. 定义路由组件模板3. 创建路由实例并定义路由规则4. 将路由实例挂载给Vue实例5. 在结构区域定义控制路...

vue 异步更新那点事儿 #web前端

异步更新那点事儿。wue & vueuse官方团队成员。看一下群友投稿的问题。什么问题?就是它这边有一个组件,这个组件里面有个userID,然后这个userID通过props传给了子组件,子组件是userinfo,它里面是用来渲染用户信息的。渲染用户信息的同时,userinfo这个组件又暴露...

异步 vs 同步:程序员必备的核心知识,理解这两者差异,你就是高手

1、同步执行(Synchronous Execution)定义: 同步执行是指程序按顺序执行,每个操作必须等待前一个操作完成才能继续进行。也就是说,程序在执行过程中会“阻塞”当前的任务,直到该任务完成才会继续执行下一个任务。特点:顺序执行:任务是按顺序执行的,必须等一个任务完成才能执行下一个任务。阻...