怎么样把以前做的网站删除,网页设计制作课程,wordpress4.5漏洞,软件开发是编程吗第一部分#xff1a;基础知识
什么是拷贝构造函数和赋值运算符#xff1f;它们之间有什么区别#xff1f;在 C 中#xff0c;const 关键字的作用是什么#xff1f;有哪些常见用法#xff1f;C 中的内存管理机制是怎样的#xff1f;如何避免内存泄漏#xff1f;虚函数基础知识
什么是拷贝构造函数和赋值运算符它们之间有什么区别在 C 中const 关键字的作用是什么有哪些常见用法C 中的内存管理机制是怎样的如何避免内存泄漏虚函数virtual function的作用是什么虚函数表vtable是如何工作的
第二部分面向对象编程
什么是多态性C 中如何实现运行时多态请解释什么是继承以及继承的优缺点。C 中的“菱形继承”是什么如何通过虚继承来解决它带来的问题什么是抽象类抽象类与接口类有何不同
第三部分STL标准模板库
std::vector 和 std::list 有什么区别它们各自的优点和缺点是什么什么是迭代器有哪些类型的迭代器std::map 和 std::unordered_map 的底层实现分别是什么性能有何差异C 中的容器适配器有哪些请举例说明。
第四部分并发与多线程
C 中如何创建线程有哪些常见的线程管理方式什么是互斥锁mutex如何避免死锁解释一下条件变量condition variable的作用并给出一个简单的使用例子。什么是线程局部存储Thread Local Storage在 C 中如何使用
第五部分C 高级特性
什么是移动语义C11 中如何实现移动构造函数与移动赋值运算符C20 中的协程coroutine是什么它们是如何工作的模板元编程Template Metaprogramming是什么在 C 中有哪些实际应用什么是 SFINAE在模板中如何利用 SFINAE 进行类型选择
第六部分现场编程
题目
请你实现一个线程安全的计数器类 ThreadSafeCounter它支持以下功能
increment()计数器加 1decrement()计数器减 1get()返回当前计数器的值
要求
使用 std::mutex 保证线程安全。实现拷贝构造和赋值运算符重载。 第一部分基础知识 拷贝构造函数和赋值运算符的区别 拷贝构造函数当用一个对象初始化另一个新对象时调用用于对象的创建。赋值运算符在已存在对象的基础上将另一个对象的内容赋值给它。区别拷贝构造函数是在对象初始化时调用的赋值运算符则在对象已经创建后进行赋值。 const 关键字的作用 修饰变量表示该变量的值不能修改。修饰指针区分指针本身是否可变和指向的对象是否可变。修饰成员函数表示该成员函数不会修改类的成员变量。 内存管理 C 使用动态分配new/delete、栈分配以及 RAII资源获取即初始化来管理内存。避免内存泄漏的方法包括使用智能指针如 std::shared_ptr 和 std::unique_ptr。 虚函数和 vtable 虚函数用于实现运行时多态基类中标记为 virtual 的函数可以在派生类中被重写。虚函数表vtable编译器为包含虚函数的类创建一个表指向虚函数的地址保证在运行时能够调用正确的函数。 第二部分面向对象编程 多态性 C 中通过虚函数实现运行时多态。基类的虚函数可以在派生类中重写通过基类指针或引用调用时动态地选择合适的派生类实现。 继承 优点允许代码重用和扩展基类功能。缺点不当的使用可能导致强耦合难以维护。 菱形继承和虚继承 菱形继承如果一个类从多个基类继承而这些基类又继承自同一祖先类会导致多个基类有相同的祖先成员。虚继承通过 virtual 继承确保继承链中的祖先类只会有一份副本。 抽象类 抽象类至少包含一个纯虚函数 0 的函数。不能实例化只能被继承。接口类所有成员函数都为纯虚函数。 第三部分STL std::vector 和 std::list 区别 std::vector基于动态数组支持随机访问插入/删除代价高中间位置。std::list基于双向链表不支持随机访问插入/删除较快。优缺点vector 适合频繁随机访问list 适合频繁插入/删除。 迭代器的类型 输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器。 std::map vs std::unordered_map std::map基于红黑树有序O(log n) 查找。std::unordered_map基于哈希表无序O(1) 平均查找但最坏情况 O(n)。 容器适配器 包括 std::stack、std::queue、std::priority_queue它们通过封装其他容器如 deque、list实现特定的行为。 第四部分并发与多线程 线程的创建 使用 std::thread 创建线程
std::thread t([] { std::cout Thread is running; });
t.join(); // 等待线程结束互斥锁mutex与死锁 互斥锁std::mutex 用于保护共享资源避免数据竞争。通过 std::lock_guard 或 std::unique_lock 自动管理锁。避免死锁使用相同顺序加锁或者使用 std::lock() 同时加锁多个资源。 条件变量 用于线程间同步等待特定条件
std::condition_variable cv;
std::mutex mtx;
bool ready false;
std::unique_lockstd::mutex lock(mtx);
cv.wait(lock, [ready] { return ready; });线程局部存储
使用 thread_local 关键字为每个线程定义独立的存储空间
thread_local int x 0; // 每个线程都有自己独立的 x 变量第五部分C 高级特性 移动语义 移动语义通过 移动构造函数 和 移动赋值运算符 避免不必要的深拷贝使用 std::move 来将对象转化为右值引用从而实现资源的转移而不是复制。 C20 协程 协程通过 co_await、co_yield、co_return 实现协程的控制流用来处理异步任务和生成器。使用例
std::futureint asyncAdd(int a, int b) {co_return a b;
}模板元编程 通过模板递归和模板特化实现编译期计算。常见应用包括类型萃取type traits和元函数。 SFINAE 在模板中Substitution Failure Is Not An Error 规则允许在匹配失败时尝试其他模板。常用于限制模板特化。
templatetypename T
std::enable_if_tstd::is_integralT::value, T add(T a, T b) { return a b; }第六部分现场编程
#include iostream
#include mutexclass ThreadSafeCounter {
private:int counter;std::mutex mtx;public:ThreadSafeCounter() : counter(0) {}// 增加计数void increment() {std::lock_guardstd::mutex lock(mtx);counter;}// 减少计数void decrement() {std::lock_guardstd::mutex lock(mtx);--counter;}// 获取当前计数int get() const {std::lock_guardstd::mutex lock(mtx);return counter;}// 拷贝构造函数ThreadSafeCounter(const ThreadSafeCounter other) {std::lock_guardstd::mutex lock(other.mtx);counter other.counter;}// 赋值运算符ThreadSafeCounter operator(const ThreadSafeCounter other) {if (this ! other) {std::lock_guardstd::mutex lockThis(mtx);std::lock_guardstd::mutex lockOther(other.mtx);counter other.counter;}return *this;}
};