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

C/C++面试题(四)

ruisui882个月前 (03-11)技术分析9

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++面试题(四)” 的相关文章

专为系统管理员设计的LINUX发行版SYSLINUXOS

SysLinuxOS 承诺“结束为管理任务寻找正确工具”的局面,提供“非常广泛的软件选择,特别是用于使用互联网”。译自 SysLinuxOS, A Linux Distro for System Administrators,作者 David Cassel。全球各地的系统集成商正在发现 SysLin...

「 VUE3 + TS + Vite 」父子组件间如何通信?

组件之间传值,大家都很熟悉,涉及到 VUE3 +TS 好多同学就无从下手了,所以分享这篇文章,希望看完后提起 VUE3+TS 能够不慌不忙。平时使用的函数如:ref、reactive、watch、computed 等需要先引入才能使用,但是本篇文章介绍的 defineProps、withDefaul...

gitlab 分支保护设置

一、功能描述代码管理中管理,我们把稳定的分支设置为保护,可以防止其他人员误操作(例如删除,合并,推送代码等)。二、Gitlab配置步骤1 点击项目Repository标签2.点击Expand标签3.配置如下:默认master是被保护的,而且只有维护人员具有推送和合并权限。设置保护分支,这里的beta...

Git 分支管理策略与工作流程

(预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。看完这篇文章后,涉及GIT的工作中就会减少因为规范问题导致工作出错,当然如果你现在暂时还未有合...

Gitlab之间进行同步备份

目前,我们公司有两个研发团队,分别在北京和武汉,考虑到访问速度的问题,原有武汉的研发环境在近端部署。也就是北京和武汉分别有两套独立的研发管理环境,虽然这解决了近端访问速度的问题,但是管理上较为分散,比如研发环境备份和恢复就是最重要的问题之一。最近,处于对安全性和合规性的考虑,希望将北京和武汉的源代码...

祸害阿里云宕机3小时的IO HANG究竟是什么?

本文来自微信公号“CSDN”(ID:CSDNnews),作者 | 王知无, 责编| 郭 芮。2019年3月3日凌晨,微博炸锅,有网友反映说阿里云疑似出现宕机,华北很多互联网公司受到暴击伤害,APP、网站全部瘫痪,我自己的朋友圈和微信群里也有好友反馈,刚刚从被窝被叫起来去修Bug,结果发现服务器登不上...