中科合讯 C++开发 一面
1. 类和 struct 的区别是什么
答案:在 C++ 里,class 和 struct 本质上非常接近,最核心的区别只有两个:默认访问权限和默认继承权限。class 的成员默认是 private,默认继承方式也是 private;struct 的成员默认是 public,默认继承方式也是 public。除此之外,struct 一样可以有构造函数、析构函数、成员函数、模板、继承、多态,功能上并不比 class 弱。工程里通常用 struct 表示偏数据聚合、语义简单的类型,用 class 表示封装性更强、强调不变量和接口约束的类型,这更多是代码风格和设计意图上的区分。
代码:
#include <iostream>
using namespace std;
struct A {
int x; // 默认 public
};
class B {
int x; // 默认 private
public:
B(int v) : x(v) {}
int get() const { return x; }
};
int main() {
A a{10};
B b(20);
cout << a.x << endl;
cout << b.get() << endl;
return 0;
}
2. struct 和 union 的区别是什么
答案:struct 里的每个成员都有各自独立的存储空间,对象大小通常至少能够容纳所有成员。union 里的所有成员共享同一块内存,同一时刻通常只适合认为其中一个成员是“当前有效”的,所以它的大小通常等于最大成员的大小,再考虑对齐。union 的典型用途是节省内存,或者做底层字节解释、协议解析、标签联合体等。但在现代 C++ 里,如果是更安全地表达“多种类型中的一种”,通常更推荐用 std::variant,因为它会显式记录当前持有的是哪种类型。
代码:
#include <iostream>
using namespace std;
union U {
int i;
float f;
};
int main() {
U u;
u.i = 10;
cout << u.i << endl;
u.f = 3.14f;
cout << u.f << endl;
return 0;
}
3. C++11 有哪些重要新特性
答案:C++11 是现代 C++ 的分水岭,比较核心的能力包括右值引用和移动语义、完美转发、auto、decltype、范围 for、nullptr、lambda、智能指针、std::thread、std::mutex、std::atomic、unordered_map、initializer_list、constexpr、static_assert 等。如果从工程价值上看,最常用的往往是这几类:一类是让代码更简洁的,比如 auto、范围 for、lambda;一类是提升性能的,比如移动语义、完美转发;一类是改善资源管理和并发编程的,比如智能指针、线程库和原子类型。很多现代 C++ 代码风格,基本都是从 C++11 开始成型的。
4. 右值引用和移动语义解决了什么问题
答案:它解决的核心问题是:临时对象或者即将销毁的对象,没有必要再做一次昂贵的深拷贝。传统 C++ 在对象传值、容器扩容、函数返回时,常常会触发大量复制。引入右值引用后,程序可以区分“还能继续使用的对象”和“可以安全转移资源的对象”,从而把内部指针、缓冲区、句柄等资源直接转移出去。这样做可以显著减少内存分配和数据拷贝,对容器、字符串、大对象传递都很关键。现代标准库的大部分性能提升,都和移动语义密切相关。
代码:
#include <iostream>
#include <vector>
using namespace std;
class Buffer {
public:
Buffer() { data = new int[100]; }
~Buffer() { delete[] data; }
Buffer(const Buffer&) {
cout << "copy\n";
data = new int[100];
}
Buffer(Buffer&& other) noexcept
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.