CppCon 2017 学习:C++ in Academia
这段内容总结了几个现代C++课程和学习资源的特点,尤其聚焦于CS 1410和CS 3370两个课程,以及Zybooks的在线C++教材。帮你提炼和整理一下重点,方便理解和对比:
Modern C++ in CS 1410
- 重点特性:
- 早期的
std::vector
和std::string
- Range-based for 循环(简化遍历)
- 统一初始化语法(uniform initialization)
- 对象管理:
- “Big 3” (拷贝构造函数、拷贝赋值运算符、析构函数)
- 基础的 RAII(资源获取即初始化)
=default
和=delete
(显示默认和删除函数)- 类内初始化器(in-class initializers)
override
关键字
- 早期的
Zybooks C++ Online Book
- 特点:
- 自包含的在线教材,带动画、交互式练习、测验
- 内置开发环境,无需安装IDE
- 自动评分
- 缺点:
- 内容主要是C++98标准,现代C++特性较少
Project-Based Learning (PBL) in CS 3370 (Intermediate/Advanced C++)
- 结构:
- 模块化课程,每个模块配套一个项目
- 项目在模块初期介绍
- 课程内容围绕完成项目展开
- 每个项目有评分标准(rubric)
- 模块内容举例:
| 模块主题 | 涉及内容 | 项目示例 |
| -------------------------- | ----------------------------------------------------------------- | ------------------------------------- |
| Memory Management I | lvalues/rvalues,指针和const,new/delete,引用,auto,decltype,=delete | 简单的双端队列(deque) |
| Memory Management II | 自定义new/delete,RAII,智能指针,placement new,reinterpret_cast | 基于类的内存池 |
| Strings, Files, Exceptions | 字符串流,流状态,文件I/O,异常安全 | XML解析器,随机访问记录文件 |
| Algorithms |<algorithm>
,<numeric>
,函数对象,lambda,bind,迭代器 | 科学数据分析 |
| Containers | 所有标准容器,严格弱序,自定义比较器 | 交叉引用生成器 |
| Operator Overloading | 位运算符,移动语义 | 位数组(bitarray,如boost::dynamic_bitset) |
| Concurrency |<thread>
,<future>
,<mutex>
,<atomic>
,<condition_variable>
| 管道架构程序 |
每个模块主题对应的一个简化版代码示例,帮你快速感受下核心点:
1. Memory Management I
主题: lvalues/rvalues,指针和const,new/delete,引用,auto,decltype,=delete
示例:简单双端队列(deque)插入操作
#include <iostream>
class SimpleDeque {int* data; // 动态数组存储数据size_t capacity; // 容量size_t frontIndex; // 队头索引size_t backIndex; // 队尾索引
public:SimpleDeque(size_t cap) : capacity(cap), frontIndex(cap / 2), backIndex(cap / 2), data(new int[cap]) {}// 构造函数,初始化容量和索引,数组从中间开始,方便两端操作~SimpleDeque() { delete[] data; } // 析构释放内存void push_front(int val) {if (frontIndex == 0) { std::cerr << "Deque full at front\n"; return; } // 防止越界data[--frontIndex] = val; // 插入到队头}void push_back(int val) {if (backIndex == capacity) { std::cerr << "Deque full at back\n"; return; } // 防止越界data[backIndex++] = val; // 插入到队尾}void print() {for (size_t i = frontIndex; i < backIndex; ++i)std::cout << data[i] << " "; // 输出所有有效元素std::cout << "\n";}
};
int main() {SimpleDeque d(10); // 创建容量为10的双端队列d.push_back(1); // 从队尾插入1d.push_front(0); // 从队头插入0d.push_back(2); // 从队尾插入2d.print(); // 输出:0 1 2
}
2. Memory Management II
主题: 自定义new/delete,RAII,智能指针,placement new,reinterpret_cast
示例:简单内存池(只示意RAII和自定义new/delete)
#include <iostream>
#include <memory>
class PoolObject {static char pool[1024]; // 预分配内存池static size_t offset; // 当前分配偏移量
public:int x;// 重载new,从内存池分配内存static void* operator new(size_t size) {if (offset + size > sizeof(pool)) throw std::bad_alloc(); // 超出池大小抛异常void* ptr = pool + offset;offset += size;std::cout << "Allocating from pool\n";return ptr;}// 重载delete,这里不释放内存,只是示意static void operator delete(void* ptr, size_t size) {std::cout << "Dealloc called (noop in pool)\n";// 真实释放逻辑省略,内存池通常统一回收}
};
char PoolObject::pool[1024]; // 定义内存池数组
size_t PoolObject::offset = 0;
int main() {PoolObject* p1 = new PoolObject(); // 从池中分配p1->x = 42;std::cout << p1->x << "\n"; // 输出42delete p1; // 调用重载的delete(无实际释放)
}
3. Strings, Files, Exceptions
主题: 字符串流,文件I/O,异常安全
示例:读取文件并捕获异常
#include <iostream>
#include <fstream>
#include <sstream>
int main() {try {std::ifstream file("test.txt"); // 打开文件if (!file) throw std::runtime_error("Cannot open file"); // 文件打开失败抛异常std::stringstream buffer;buffer << file.rdbuf(); // 读取整个文件内容到字符串流中std::cout << buffer.str() << "\n"; // 输出文件内容} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << "\n"; // 捕获并打印异常信息}
}
4. Algorithms
主题: <algorithm>
, <numeric>
, lambda,bind
示例:使用std::accumulate
和lambda
#include <iostream>
#include <vector>
#include <numeric> // std::accumulate
int main() {std::vector<int> v{1, 2, 3, 4, 5};// accumulate对区间求和,初值0,lambda表达式表示加法int sum = std::accumulate(v.begin(), v.end(), 0, [](int a, int b) { return a + b; });std::cout << "Sum = " << sum << "\n"; // 输出15
}
5. Containers
主题: 标准容器,自定义比较器
示例:用std::set
自定义排序
#include <iostream>
#include <set>
// 反转排序比较器,greater变成升序变降序
struct ReverseOrder {bool operator()(int a, int b) const { return a > b; }
};
int main() {std::set<int, ReverseOrder> s = {3, 1, 4, 1, 5};// set自动去重,按ReverseOrder排序for (int x : s) std::cout << x << " "; // 输出: 5 4 3 1
}
6. Operator Overloading
主题: 位运算符,移动语义
示例:简单位数组类重载位运算符
#include <iostream>
class BitArray {unsigned int bits;
public:BitArray() : bits(0) {}BitArray(unsigned int b) : bits(b) {}// 重载&运算符,实现按位与BitArray operator&(const BitArray& other) const {return BitArray(bits & other.bits);}// 打印二进制位(32位)void print() {for (int i = 31; i >= 0; --i)std::cout << ((bits >> i) & 1);std::cout << "\n";}
};
int main() {BitArray a(0b1100);BitArray b(0b1010);BitArray c = a & b; // 位与结果0b1000c.print(); // 输出00000000000000000000000000001000
}
7. Concurrency
主题: <thread>
, <mutex>
, <atomic>
示例:线程安全计数器
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0); // 原子计数器,线程安全
void worker() {for (int i = 0; i < 1000; ++i) {++counter; // 原子递增}
}
int main() {std::thread t1(worker);std::thread t2(worker);t1.join(); // 等待线程结束t2.join();std::cout << "Counter: " << counter.load() << "\n"; // 输出2000
}
这里提到了学校里其他用到C++的课程,以及一些现实中的挑战,比如:
- 课程中用C++的方向很广:数值计算(3320),设计模式(3450),计算机体系结构(4380,写虚拟机和汇编),编程语言(4450),AI(4470),编译原理(4490)等。
- 都是CS学位必修课,C++作为核心技能被广泛应用。
- 你还提到了学习资源的问题:
- 需要可访问的、支持C++17的新材料,且最好是免费的在线资源,不一定要纸质书。
- 需要涵盖GUI开发、Web开发等常见开发场景的库和工具。
- 希望有跨平台、易用的IDE,最好是云端,但云端IDE一般对GUI开发支持不好。