22.1 — 智能指针和移动语义简介
考虑一个我们动态分配值的函数: void someFunction() { Resource* ptr = new Resource(); // Resource 是一个结构体或类 // 在这里使用 ptr 删除 ptr; } 尽管上述代码看起来相当简单,但很容易忘记释放 ptr。即使是…
考虑一个我们动态分配值的函数: void someFunction() { Resource* ptr = new Resource(); // Resource 是一个结构体或类 // 在这里使用 ptr 删除 ptr; } 尽管上述代码看起来相当简单,但很容易忘记释放 ptr。即使是…
章节回顾 异常处理提供了一种机制,将错误或其他异常情况的处理与代码的典型控制流解耦。这允许在给定情况下以最有用的方式和时间处理错误,从而减轻了许多(如果不是全部)混乱…
Try 和 catch 块在大多数情况下都足够好用,但在一种特定情况下它们不够用。考虑以下示例: #include <iostream> class A { private: int m_x; public: A(int x) : m_x{x} { if (x <= 0) throw 1; // 异常在这里抛出 …
考虑以下这个小程序: #include <iostream> enum class FruitType { apple, banana, cherry }; class Fruit { private: FruitType m_type { }; int m_percentageEaten { 0 }; public: Fruit(FruitType type) : m_type { type } { } FruitType getType() { return m_type; } int getPercentageEaten() { return m_percentageEaten; } …
在上一课中,我们看了一个简单的模板化 Storage 类,以及一个针对 double 类型的特化: #include <iostream> template <typename T> class Storage { private: T m_value {}; public: Storage(T value) : m_value { value } { } void print() { std::cout << m_value << …
当为给定类型实例化函数模板时,编译器会根据模板函数创建一个副本,并用变量声明中使用的实际类型替换模板类型参数。这意味着特定函数对于每个实例化类型都将具有相同的实现细节(只是…
C++ 继承和虚函数之旅到此结束。亲爱的读者,别担心,我们前进的道路上还有许多其他 C++ 领域有待探索。章节摘要 C++ 允许你将基类指针和引用设置为派生对象。这…
考虑以下使用虚函数的程序: #include <iostream> class Base { public: virtual void print() const { std::cout << “Base”; } }; class Derived : public Base { public: void print() const override { std::cout << “Derived”; } }; int main() { Derived d{}; Base& …