C++98(ISO/IEC 14882:1998)

C++98 是 C++ 的第一个标准化版本(ISO/IEC 14882:1998),它正式确立了 C++ 的核心语言特性和标准库。以下是 C++98 的主要特性总结:

一、核心语言特性**

  1. 模板(Templates)
    • 支持函数模板和类模板,实现泛型编程。
    • 例如:std::vectorstd::sort 等标准库组件依赖模板。
  2. 标准模板库(STL)
    • 包含容器(如 vectorlistmap)、迭代器(iterators)和算法(如 sortfind)。
    • 基于泛型编程思想,强调“数据与算法分离”。
  3. 异常处理(Exception Handling)
    • 引入 trycatchthrow 机制,支持错误处理的标准化。
  4. 命名空间(Namespaces)
    • 避免命名冲突,例如 std 是标准库的命名空间。
  5. RTTI(运行时类型识别)
    • 支持 typeiddynamic_cast,允许在运行时检查类型。
  6. bool 类型
    • 引入 bool 关键字(true/false),取代传统的 int 表示布尔值。
  7. mutable 关键字
    • 允许在 const 成员函数中修改被标记为 mutable 的成员变量。
  8. 显式类型转换
    • 提供 static_castdynamic_castconst_castreinterpret_cast,替代 C 风格的强制转换。
  9. 默认参数和函数重载
    • 支持函数参数的默认值和函数重载(相同函数名,不同参数列表)。

二、标准库组件

  1. 容器(Containers)
    • 序列容器:vectordequelist
    • 关联容器:setmapmultisetmultimap
    • 适配器:stackqueuepriority_queue
  2. 迭代器(Iterators)
    • 提供统一的遍历容器元素的接口(如 begin()end())。
  3. 算法(Algorithms)
    • sort()find()copy() 等,通过迭代器操作容器。
  4. 字符串类(std::string)
    • 提供安全的字符串操作,替代 C 风格字符数组。
  5. 输入/输出流(I/O Streams)
    • iostream(如 cincout)、fstream(文件操作)、sstream(字符串流)。
  6. 数值处理
    • 定义数值类型的极值, 提供数学函数。

三、其他重要特性

  1. 局部对象析构顺序
    • 局部对象的析构顺序与构造顺序相反(RAII 基础)。
  2. 运算符重载
    • 允许自定义运算符行为(如 +<<)。
  3. 友元(friend)
    • 允许非成员函数或类访问私有成员。
  4. 静态成员
    • 类的静态成员变量和函数。

C++03(ISO/IEC 14882:2003)

C++03(ISO/IEC 14882:2003)是 C++98 的一个技术修正版本(Technical Corrigendum),主要修复了标准中的缺陷和模糊表述,并未引入显著的新特性。它通常被视为 C++98 的“bug fix”版本,核心特性和语法与 C++98 完全一致。以下是 C++03 的细节说明:

一、C++03 的核心变化

  1. 标准文本修正
    • 修复了 C++98 标准中的语法歧义未定义行为的表述。
    • 例如:模板解析规则、模板友元声明的语法等细节更明确。
  2. 标准库的兼容性改进
    • 修正了 STL 中部分容器的接口行为(如 std::vector 的成员函数异常安全性)。
    • 明确 std::basic_string 的存储连续性(C++03 保证 &s[0] 是连续内存)。
  3. 数值限制的扩展
    • 在 `` 中增加了对 long longunsigned long long 的支持(尽管这些类型在 C++11 才正式成为关键字)。

二、与 C++98 的兼容性

  • 语法完全兼容:所有 C++98 代码在 C++03 中无需修改即可编译。
  • 编译器支持:主流编译器(如 GCC、MSVC)通常将 C++98 和 C++03 视为同一版本实现。

三、为什么需要 C++03?

C++98 标准中存在一些未明确的边界情况,例如:

  • 模板中嵌套依赖名称的解析规则(需用 typename 消除歧义)。
  • 局部模板特化的合法性(C++03 明确禁止)。
    这些修正提高了代码的可移植性和一致性。

C++11(ISO/IEC 14882:2011)

C++11(ISO/IEC 14882:2011)是 C++ 的一次重大更新,引入了许多革命性特性,显著提升了代码的简洁性、安全性和性能。以下是 C++11 的核心特性分类总结:

一、核心语言特性

  1. 自动类型推导(auto

    • 编译器自动推断变量类型,简化代码:

      auto x = 5;          // int
      auto str = "hello";  // const char*
      
  2. 范围 for 循环

    • 简化容器遍历:

      std::vector<int> v = {1, 2, 3};
      for (auto& num : v) { std::cout << num; }
      
  3. 右值引用与移动语义(&&

    • 避免深拷贝,提升性能:

      std::vector<std::string> v;
      v.push_back(std::move(str));  // 移动而非拷贝
      
  4. Lambda 表达式

    • 匿名函数,支持闭包:

      auto add = [](int a, int b) { return a + b; };
      std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
      
  5. nullptr 关键字

    • 替代NULL,明确表示空指针:

      int* p = nullptr;
      
  6. 强类型枚举(enum class

    • 避免命名冲突,限制作用域:

      enum class Color { Red, Green };
      Color c = Color::Red;  // 必须带作用域
      
  7. constexpr 常量表达式

    • 编译时计算:

      constexpr int square(int x) { return x * x; }
      int arr[square(3)];  // 编译期确定数组大小
      
  8. 委托构造函数

    • 构造函数调用其他构造函数:

      class A {
      public:A() : A(0) {}      // 委托给 A(int)A(int x) { /*...*/ }
      };
      
  9. overridefinal

    • 显式标记虚函数重写或禁止继承:

      class B final {};       // 禁止继承
      virtual void foo() override;  // 确保重写基类虚函数
      

二、标准库增强

  1. 智能指针

    • 自动内存管理:

      std::unique_ptr<int> ptr(new int(10));  // 独占所有权
      std::shared_ptr<int> sptr = std::make_shared<int>(20);  // 共享所有权
      
  2. std::thread 多线程支持

    • 原生多线程库:

      std::thread t([]() { std::cout << "Hello from thread!"; });
      t.join();
      
  3. 哈希表容器

    • 新增无序关联容器:

      std::unordered_map<std::string, int> hash_map;
      
  4. std::functionstd::bind

    • 通用函数包装器:

      std::function<int(int, int)> func = std::plus<int>();
      std::bind(func, 1, std::placeholders::_1)(2);  // 绑定参数
      
  5. 正则表达式(``)

    • 支持正则操作:

      std::regex pattern("\\d+");
      bool match = std::regex_search("123", pattern);
      
  6. 元组(std::tuple

    • 多类型值集合:

      auto t = std::make_tuple(1, "hello", 3.14);
      

三、其他重要特性

  1. 变长模板(Variadic Templates)

    • 支持任意数量模板参数:

      template<typename... Args>
      void log(Args... args) { /*...*/ }
      
  2. 列表初始化(Uniform Initialization)

    • 统一初始化语法:

      std::vector<int> v{1, 2, 3};  // 替代旧式括号初始化
      
  3. static_assert 编译时断言

    • 编译期条件检查:

      static_assert(sizeof(int) == 4, "int must be 4 bytes");
      
  4. noexcept 异常规范

    • 标记函数不抛异常:

      void foo() noexcept { /*...*/ }
      

C++14(ISO/IEC 14882:2014)

C++14(ISO/IEC 14882:2014)是 C++11 的小幅改进版本,主要目标是完善 C++11 的特性并修复一些缺陷,而非引入重大变革。以下是 C++14 的核心特性分类总结:

一、核心语言改进

  1. 泛型 Lambda 表达式

    • Lambda 参数支持auto,实现真正的泛型:

      auto lambda = [](auto x, auto y) { return x + y; };
      std::cout << lambda(1, 2.5);  // 混合类型参数
      
  2. constexpr 函数扩展

    • 允许constexpr函数包含局部变量、循环和简单分支:

      constexpr int factorial(int n) {int result = 1;for (int i = 1; i <= n; ++i) result *= i;return result;
      }
      int arr[factorial(5)];  // 编译期计算 120
      
  3. 变量模板(Variable Templates)

    • 模板可以定义变量而不仅是类型或函数:

      template<typename T>
      constexpr T pi = T(3.1415926535897932385);
      std::cout << pi<double>;  // 输出 double 精度的 π
      
  4. 二进制字面量

    • 直接使用二进制数:

      int mask = 0b110101;  // 十进制 53
      
  5. 数字分隔符(Digit Separators)

    • 提高长数字可读性:

      int million = 1'000'000;
      double pi = 3.141'592'6535;
      
  6. 函数返回类型推导(auto 返回类型)

    • 省略尾置返回类型(C++11 需要-> decltype(...)):

      auto add(int a, int b) { return a + b; }  // 自动推导为 int
      
  7. [[deprecated]] 属性

    • 标记过时代码,编译时警告:

      [[deprecated("Use new_func() instead")]]
      void old_func() {}
      

二、标准库增强

  1. std::make_unique

    • 补充 C++11 的std::make_shared,为unique_ptr 提供工厂函数:

      auto ptr = std::make_unique<int>(42);  // 替代 new
      
  2. 标准库的 constexpr 支持

    • 部分标准库函数(如 std::arraystd::tuple 的部分操作)可在编译期使用。
  3. std::integer_sequence

    • 编译时整数序列,用于元编程:

      template<typename T, T... Ints>
      void print_sequence(std::integer_sequence<T, Ints...>) {((std::cout << Ints << ' '), ...);  // C++17 折叠表达式
      }
      print_sequence(std::index_sequence<1, 2, 3>{});  // 输出: 1 2 3
      
  4. std::exchange

    • 原子性地替换对象值并返回旧值:

      int x = 1;
      int old = std::exchange(x, 42);  // x=42, old=1
      
  5. std::quoted

    • 方便处理带引号的字符串(如 CSV 文件):

      std::cout << std::quoted("Hello");  // 输出: "Hello"
      

三、其他改进

  1. 聚合成员初始化扩展

    • 允许聚合类(无自定义构造函数的类)使用默认初始化:

      struct Point { int x; int y; };
      Point p{1};  // y 初始化为 0(C++11 需完整初始化)
      
  2. Lambda 捕获表达式的改进

    • 支持在捕获列表中直接初始化变量:

      auto lambda = [value = 42]() { return value; };
      
  3. sizeof 运算符的扩展

    • 可直接用于成员变量(无需实例化对象):

      struct S { int x; double y; };
      size_t sz = sizeof(S::x);  // 等价于 sizeof(int)
      

C++17(ISO/IEC 14882:2020)

C++17(ISO/IEC 14882:2017)是 C++14 的增量升级版本,虽然没有 C++11 或 C++20 那样的革命性变化,但引入了许多实用特性,进一步简化代码并提升性能。以下是 C++17 的核心特性分类总结:

一、核心语言特性

  1. 结构化绑定(Structured Bindings)

    • 解构元组、结构体或数组为独立变量:

      std::pair<int, std::string> p{42, "hello"};
      auto [num, str] = p;  // num=42, str="hello"
      
  2. ifswitch 的初始化语句

    • 在条件语句中定义局部变量:

      if (auto it = map.find(key); it != map.end()) {// 使用 it
      }  // it 作用域仅限于 if 块
      
  3. constexpr if

    • 编译期条件分支,简化模板元编程:

      template <typename T>
      auto get_value(T t) {if constexpr (std::is_pointer_v<T>) return *t;else return t;
      }
      
  4. 内联变量(Inline Variables)

    • 允许头文件中定义inline变量,避免多重定义错误:

      // header.h
      inline int global_value = 42;  // 多个 cpp 包含时不会链接错误
      
  5. 折叠表达式(Fold Expressions)

    • 简化可变参数模板的展开:

      template <typename... Args>
      auto sum(Args... args) { return (... + args); }  // args1 + args2 + ...
      
  6. auto 模板参数

    • 非类型模板参数支持auto

      template <auto value>
      void print() { std::cout << value; }
      print<42>();  // 输出 42
      
  7. std::byte

    • 明确表示字节的类型(替代charunsigned char):

      std::byte b{0xFF};
      
  8. 构造函数模板推导(CTAD)

    • 省略模板参数,自动推导容器类型:

      std::pair p(1, "hello");  // 自动推导为 std::pair<int, const char*>
      std::vector v{1, 2, 3};   // 推导为 std::vector<int>
      

二、标准库增强

  1. std::optional

    • 表示可选值,避免使用nullptr或特殊值:

      std::optional<int> maybe_num = std::nullopt;
      if (maybe_num) std::cout << *maybe_num;
      
  2. std::variant

    • 类型安全的联合体(替代union):

      std::variant<int, std::string> v = "hello";
      std::cout << std::get<std::string>(v);  // 输出 hello
      
  3. std::any

    • 存储任意类型:

      std::any a = 42;
      std::cout << std::any_cast<int>(a);  // 输出 42
      
  4. std::string_view

    • 非拥有的字符串视图,避免拷贝:

      std::string s = "hello";
      std::string_view sv = s.substr(0, 3);  // "hel"(不拷贝数据)
      
  5. std::filesystem

    • 文件系统操作(跨平台路径处理):

      namespace fs = std::filesystem;
      fs::path p = "dir/file.txt";
      if (fs::exists(p)) std::cout << p.filename();  // "file.txt"
      
  6. 并行算法(Parallel Algorithms)

    • 标准库算法支持并行执行:

      std::vector<int> v = {...};
      std::sort(std::execution::par, v.begin(), v.end());  // 并行排序
      
  7. std::invokestd::apply

    • 统一调用函数和展开元组参数:

      auto func = [](int a, int b) { return a + b; };
      std::tuple args{1, 2};
      std::cout << std::apply(func, args);  // 输出 3
      

三、其他改进

  1. 嵌套命名空间定义简化

    • 简化嵌套命名空间的语法:

      namespace A::B::C { }  // 替代 namespace A { namespace B { namespace C {} } }
      
  2. __has_include 预处理表达式

    • 检测头文件是否可用:

      #if __has_include(<optional>)#include <optional>
      #endif
      
  3. [[fallthrough]] 属性

    • 明确标记switch中的穿透(fallthrough)行为:

      switch (x) {case 1: do_something(); [[fallthrough]];  // 明确告知编译器case 2: break;
      }
      
  4. [[nodiscard]] 属性

    • 强制检查函数返回值(避免忽略错误):

      [[nodiscard]] int compute_important_value();
      compute_important_value();  // 编译器警告:未使用返回值
      

C++20(ISO/IEC 14882:2020)**

C++20(ISO/IEC 14882:2020)是继 C++17 之后的重大更新,引入了许多革命性特性,显著提升了代码的表达能力、性能和安全性。以下是 C++20 的核心特性分类总结:

一、核心语言特性

  1. 概念(Concepts)

    • 对模板参数进行约束,提升错误信息可读性:

      template <typename T>
      concept Addable = requires(T a, T b) { a + b; };  // 要求类型支持 + 操作template <Addable T>
      T sum(T a, T b) { return a + b; }  // 仅接受满足 Addable 的类型
      
  2. 模块(Modules)

    • 替代头文件(#include),加快编译速度:

      // math.ixx (模块接口文件)
      export module math;
      export int add(int a, int b) { return a + b; }// main.cpp
      import math;
      int main() { return add(1, 2); }
      
  3. 协程(Coroutines)

    • 支持挂起/恢复的函数,简化异步代码:

      generator<int> range(int start, int end) {for (int i = start; i < end; ++i)co_yield i;  // 挂起并返回值
      }
      for (int i : range(1, 5)) { /*...*/ }  // 输出 1, 2, 3, 4
      
  4. 三路比较(<=>,Spaceship Operator)

    • 简化比较运算符定义:

      struct Point {int x, y;auto operator<=>(const Point&) const = default;  // 自动生成 ==, !=, <, > 等
      };
      
  5. 范围 for 循环的初始化语句

    • 允许在范围for 中定义局部变量:

      for (auto vec = get_vector(); auto& x : vec) { /*...*/ }
      
  6. constexpr 进一步扩展

    • 支持virtual函数、try-catch、动态内存分配等:

      constexpr int safe_divide(int a, int b) {if (b == 0) throw "Division by zero";  // 编译期异常return a / b;
      }
      
  7. consteval 立即函数

    • 强制函数在编译期执行:

      consteval int square(int x) { return x * x; }
      int arr[square(3)];  // 必须编译期计算
      
  8. [[no_unique_address]] 属性

    • 优化空类型成员的内存占用:

      struct Empty {};
      struct S {[[no_unique_address]] Empty e;  // 可能不占额外内存int x;
      };
      

二、标准库增强

  1. 范围库(Ranges)

    • 提供管道式操作(|),简化容器处理:

      #include <ranges>
      std::vector<int> v = {1, 2, 3, 4, 5};
      auto even = v | std::views::filter([](int x) { return x % 2 == 0; });
      for (int i : even) { /*...*/ }  // 输出 2, 4
      
  2. std::format 格式化库

    • 类型安全的字符串格式化(类似 Python):

      #include <format>
      std::string s = std::format("Hello, {}! The answer is {:.2f}.", "world", 3.14159);
      
  3. std::span

    • 轻量级非拥有视图,替代原始指针 + 长度:

      void print(std::span<int> s) {for (int x : s) std::cout << x << " ";
      }
      std::vector<int> v = {1, 2, 3};
      print(v);  // 自动转换
      
  4. std::jthread

    • 自动合并(join)的线程,避免资源泄漏:

      std::jthread t([]() { std::cout << "Thread running"; });  // 析构时自动 join
      
  5. std::atomic_ref

    • 对非原子变量的原子操作:

      int x = 0;
      std::atomic_ref<int> atomic_x(x);
      atomic_x.fetch_add(1);  // 原子操作
      
  6. 日历和时区支持(`` 扩展)

    • 处理日期和时间:

      auto now = std::chrono::system_clock::now();
      auto today = std::chrono::floor<std::chrono::days>(now);
      std::cout << std::format("Today is {:%F}", today);  // 输出 YYYY-MM-DD
      

三、其他重要特性

  1. constinit 关键字

    • 确保全局变量静态初始化:

      constinit static int x = 42;  // 必须编译期初始化
      
  2. 位操作库(``)

    • 提供位运算工具:

      if (std::has_single_bit(8)) { /* 检查是否为 2 的幂 */ }
      
  3. std::source_location

    • 替代__LINE____FILE__,获取代码位置:

      void log(std::source_location loc = std::source_location::current()) {std::cout << loc.file_name() << ":" << loc.line();
      }
      
  4. 协程标准库支持

    • 提供 std::coroutine_handlestd::suspend_always 等基础设施。

C++23(ISO/IEC 14882:2023)

C++23(ISO/IEC 14882:2023)是 C++20 之后的增量更新版本,虽然不如 C++20 那样引入大量革命性特性,但仍包含许多实用改进,进一步简化代码、增强表达能力和性能。以下是 C++23 的核心特性分类总结:

一、核心语言特性

  1. #elifdef#elifndef

    • 简化条件编译的语法,与#ifdef/#ifndef风格一致:

      #ifdef FEATURE_A// ...
      #elifdef FEATURE_B  // 替代 #elif defined(FEATURE_B)// ...
      #endif
      
  2. auto(x)auto{x}(显式复制构造)

    • 强制复制对象并保留类型推导:

      std::vector<int> v1 = {1, 2, 3};
      auto v2 = auto(v1);  // 显式复制,v2 是 std::vector<int>
      
  3. 多维 operator[]mdspan 支持)

    • 允许自定义多维下标运算符:

      struct Matrix {int data[3][3];int* operator[](size_t i) { return data[i]; }int operator[](size_t i, size_t j) const { return data[i][j]; }  // C++23
      };
      Matrix m;
      m[1, 2] = 42;  // 多维访问
      
  4. constexpr 扩展

    • 支持constexpr函数中的std::unique_ptrstd::shared_ptr(编译期动态内存管理):

      constexpr auto create() {auto p = std::make_unique<int>(42);return *p;
      }
      static_assert(create() == 42);  // 编译期执行
      
  5. if consteval

    • 检测当前是否在编译期上下文中执行:

      constexpr int foo() {if consteval { return 42; }  // 编译期分支else { return 0; }
      }
      
  6. [[]] 属性的位置放宽

    • 允许属性出现在更多位置(如lambda捕获列表前):

      auto func = [][[nodiscard]] () { return 42; };
      

二、标准库增强

  1. std::mdspan(多维视图)

    • 非拥有的多维数组视图,支持灵活切片和步长:

      #include <mdspan>
      int data[2][3] = {{1, 2, 3}, {4, 5, 6}};
      std::mdspan mat(data);
      std::cout << mat[1, 2];  // 输出 6
      
  2. std::printstd::println

    • 简化格式化输出(无需<format>显式调用):

      #include <print>
      std::println("Hello, {}!", "world");  // 输出: Hello, world!
      
  3. std::expected

    • 表示可能成功或失败的操作(替代std::optional+ 错误码):

      std::expected<int, std::string> parse_input(std::string_view s) {if (s.empty()) return std::unexpected("Empty input");return 42;
      }
      auto result = parse_input("test");
      if (result) std::println("{}", *result);
      
  4. std::generator(协程生成器)

    • 标准库协程生成器(简化range实现):

      #include <generator>
      std::generator<int> range(int start, int end) {for (int i = start; i < end; ++i) co_yield i;
      }
      for (int i : range(1, 5)) std::print("{} ", i);  // 输出: 1 2 3 4
      
  5. std::flat_mapstd::flat_set

    • 基于有序向量的关联容器(性能与内存的折衷):

      std::flat_map<int, std::string> fm = {{1, "one"}, {2, "two"}};
      fm[3] = "three";  // 自动排序
      
  6. `` 改进

    • 增强堆栈跟踪功能(调试支持):

      #include <stacktrace>
      void foo() {auto st = std::stacktrace::current();std::println("{}", std::to_string(st));  // 打印调用栈
      }
      
  7. std::to_underlying

    • 转换枚举到其底层类型:

      enum class Color : uint8_t { Red = 1, Green };
      auto val = std::to_underlying(Color::Green);  // uint8_t(2)
      

三、其他实用改进

  1. std::byteswap

    • 编译期字节交换(用于大小端转换):

      constexpr uint32_t x = 0x12345678;
      constexpr auto y = std::byteswap(x);  // 0x78563412
      
  2. std::unreachable()

    • 标记不可达代码(优化提示):

      if (x > 0) do_something();
      else std::unreachable();  // 假设 x 永远 > 0
      
  3. std::move_only_function

    • 仅支持移动的函数包装器(替代std::function的部分场景):

      std::move_only_function<int()> func = [] { return 42; };
      auto f2 = std::move(func);  // func 变为空
      
  4. std::hive(实验性)

    • 支持指针稳定的序列容器(类似std::list但内存连续):

      std::hive<int> h = {1, 2, 3};
      auto it = h.begin(); ++it;
      h.erase(it);  // 其他迭代器仍有效
      

C++六大默认成员函数

在 C++ 中,如果一个类没有显式定义某些特殊成员函数,编译器会自动生成默认版本。这些默认函数共有 6 个,通常被称为 “六大默认成员函数”(或 “六大特殊成员函数”)。以下是它们的详细说明:

class Example {
public:Example() = default;                 // 显式要求生成默认构造~Example() = default;                // 显式生成默认析构Example(const Example&) = delete;    // 禁用拷贝构造Example& operator=(Example&&) = default; // 显式生成移动赋值ClassName& operator=(ClassName&&);
};

1. 默认构造函数 (Default Constructor)

  • 形式: ClassName()
  • 作用: 初始化对象的成员(基本类型不初始化,类类型调用其默认构造)。
  • 生成条件: 当类中没有定义任何构造函数时生成。
  • 注意: 如果定义了其他构造函数,则不会生成默认构造,需手动添加。

2. 默认析构函数 (Destructor)

  • 形式: ~ClassName()
  • 作用: 释放对象资源(成员变量会自动析构)。
  • 生成条件: 总是生成,除非显式定义。
  • 注意: 若类管理动态资源(如指针),通常需要手动定义析构函数。

3. 默认拷贝构造函数 (Copy Constructor)

  • 形式: ClassName(const ClassName&)
  • 作用: 用同类型的另一个对象初始化新对象(浅拷贝)。
  • 生成条件: 当类中未显式定义拷贝构造时生成。
  • 注意: 若类包含指针或动态资源,需手动实现深拷贝。

4. 默认拷贝赋值运算符 (Copy Assignment Operator)

  • 形式: ClassName& operator=(const ClassName&)
  • 作用: 将一个对象的值赋给另一个已存在的对象(浅拷贝)。
  • 生成条件: 当类中未显式定义拷贝赋值时生成。
  • 注意: 类似拷贝构造,需处理深拷贝问题。

5. 默认移动构造函数 (Move Constructor) (C++11 引入)

  • 形式: ClassName(ClassName&&)
  • 作用: 通过“窃取”右值对象的资源来初始化新对象。
  • 生成条件: 当类中未显式定义移动构造、拷贝构造、拷贝赋值、析构函数时生成。
  • 注意: 适用于优化临时对象的资源转移。

6. 默认移动赋值运算符 (Move Assignment Operator) (C++11 引入)

  • 形式: ClassName& operator=(ClassName&&)
  • 作用: 通过“窃取”右值对象的资源赋值给已存在对象。
  • 生成条件: 当类中未显式定义移动赋值、拷贝构造、拷贝赋值、析构函数时生成。

总结表

默认函数形式生成条件(未显式定义时)
默认构造函数ClassName()无任何构造函数
析构函数~ClassName()总是生成
拷贝构造函数ClassName(const ClassName&)无拷贝构造
拷贝赋值运算符ClassName& operator=(...)无拷贝赋值
移动构造函数 (C++11)ClassName(ClassName&&)无拷贝/移动构造、拷贝赋值、析构
移动赋值运算符 (C++11)ClassName& operator=(...)无拷贝/移动赋值、拷贝构造、析构

关键注意事项

  1. 浅拷贝问题:默认拷贝构造和拷贝赋值是浅拷贝,可能引发双重释放(需手动实现深拷贝)。
  2. Rule of Three/Five/Zero
    • 如果定义了拷贝构造、拷贝赋值或析构中的任意一个,通常需要定义全部(C++03)。
    • 在 C++11 后,还需考虑移动构造和移动赋值(Rule of Five)。
    • 最佳实践是使用 =default=delete 明确需求,或遵循 Rule of Zero(依赖智能指针等自动管理资源)。
  3. =default=delete
    • 可用 =default 显式要求编译器生成默认实现。
    • =delete 禁止特定函数(如禁用拷贝)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84830.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84830.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84830.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

词编码模型怎么进行训练的,输出输入是什么,标签是什么

词编码模型怎么进行训练的,输出输入是什么,标签是什么 词编码模型的训练本质是通过数据驱动的方式,将离散的文本符号映射为连续的语义向量。 一、训练机制:从符号到向量的映射逻辑 1. 核心目标 将单词/子词(Token)映射为低维向量,使语义相关的词在向量空间中距离更近…

【Linux指南】文件管理高级操作(复制、移动、查找)

引言 在Linux系统管理中&#xff0c;文件的复制、移动与查找是比基础操作更进阶的核心技能&#xff0c;它们构成了高效管理文件系统的"三驾马车"。当我们需要备份重要数据、重构目录结构或在庞大的文件系统中定位目标文件时&#xff0c;cp、mv、find等命令将成为最得…

【栈】-----【小C的记事本】

小C的记事本 题目描述 小C最近学会了 Java 小程序的开发&#xff0c;他很开心&#xff0c;于是想做一个简单的记事本程序练练手。 他希望他的记事本包含以下功能&#xff1a; append(str)&#xff1a;向记事本插入字符串 str&#xff08;英文字符&#xff09;。delete(k)&am…

技能系统详解(2)——特效表现

特效会有个EffectManager用于统一管理所有特效&#xff0c;技能特效只是各类特效中的一种 EffectManager需要提供特效的创建&#xff0c;返回被封装为EffectHandle 每类特效都有各种不同的配置参数&#xff0c;这些配置参数会传递给EffectManager用于生成EffectHandler 为支…

12.OpenCV—基础入门

01读取图像 02创建空白图像 03保存图像 04更改图像亮度 05更改图像对比度 06灰度直方图均衡 07彩色直方图均衡 08五种滤波方式 09形态学操作 10仿射变换 11角度缩放仿射变换 12透视变换 13坐标映射 14模板匹配 15多模板匹配 16查找轮廓线 17轮廓线匹配 17绘制…

【Python】Python之什么是生成器?什么是迭代器?

目录 专栏导读前言什么是迭代器&#xff08;Iterator&#xff09;&#xff1f;迭代器的定义迭代器协议可迭代对象 vs 迭代器自定义迭代器迭代器的优势 什么是生成器&#xff08;Generator&#xff09;&#xff1f;生成器的定义生成器函数生成器表达式复杂的生成器示例生成器的状…

Python中实现简单爬虫并处理数据

在当今数据驱动的时代&#xff0c;能够从互联网上高效地抓取信息变得越来越重要。Python因其简洁易学的特性&#xff0c;成为了编写网络爬虫的首选语言之一。接下来&#xff0c;我将介绍如何使用Python来实现一个基础的网络爬虫&#xff0c;并对收集到的数据进行初步处理。 首先…

免费wordpress主题网

免费WordPress主题网 WP模板牛 WP模板牛是一个提供免费WordPress主题的网站&#xff0c;用户可以在这里找到大量高质量的模板&#xff0c;适用于各种网站类型。该网站致力于为用户提供简单、高效的建站体验。 官网链接&#xff1a; https://wpniu.com 建站哥模板 建站哥模板…

为什么需要MyBatis-Plus条件构造器?

目录 前言 一、传统SQL编写的痛点 二、条件构造器的核心优势 1. 防SQL注入&#xff08;安全性&#xff09; 2. 面向对象编程&#xff08;可读性&#xff09; 3. 动态条件构建&#xff08;灵活性&#xff09; 4. 数据库无关性&#xff08;可移植性&#xff09; 三、典型应…

【从零学习JVM|第九篇】常见的垃圾回收算法和垃圾回收器

前言&#xff1a; 我们知道在堆内存中&#xff0c;会有自动的垃圾回收功能&#xff0c;那今天这篇文章将会向你介绍&#xff0c;这个功能实现的方式&#xff0c;还有实现的对象&#xff0c;接下来就由我来给你们详细介绍垃圾回收的算法和实现算法的回收器。 目录 前言&#…

品牌窜货治理解决方案

在渠道网络的暗潮中&#xff0c;窜货犹如隐秘的漩涡&#xff0c;某知名白酒品牌曾因区域窜货导致终端价格体系崩溃&#xff0c;半年内损失超3亿元。窜货行为不仅破坏市场秩序&#xff0c;更会引发信任危机。随着电商平台的多元化与分销层级的复杂化&#xff0c;品牌方亟需构建一…

车载电子电器架构 --- 法律和标准对电子电气架构的影响

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

一种通用跨平台实现SEH的解决方案

一. 前言 众所周知&#xff0c;在软件的代码中&#xff0c;处理软件本身的逻辑只要大约1/3的代码&#xff0c;另外2/3的代码实际上是在处理各种各样的异常情况。 这些异常情况一方面是因为不同用户之间不同的硬件软件环境要处理。另一方面是程序中可能出现的bug。比较典型的情…

25.6.19学习总结

什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆是一种特殊的树形数据结构&#xff0c;它满足以下两个主要属性&#xff1a; 结构性&#xff08;完全二叉树&#xff09;&#xff1a; 堆总是一个完全二叉树 (Complete Binary Tree)。这意味着&#xff0c;除了最后一层&am…

【前后前】导入Excel文件闭环模型:Vue3前端上传Excel文件,【Java后端接收、解析、返回数据】,Vue3前端接收展示数据

【前后前】导入Excel文件闭环模型&#xff1a;Vue3前端上传Excel文件&#xff0c;【Java后端接收、解析、返回数据】&#xff0c;Vue3前端接收展示数据 一、Vue3前端上传&#xff08;导入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

网络基础入门:从OSI模型到TCP/IP协议详解

网络基础入门&#xff1a;从OSI模型到TCP/IP协议详解 一、网络基础概念与OSI七层模型 1.1 网络通信的本质 计算机网络的核心是将抽象语言转换为二进制数据进行传输与计算&#xff0c;这一过程涉及多层抽象与转换&#xff1a; 应用层&#xff1a;人机交互—抽象语言------编…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了两个影响主流 Linux 发行版的本地权限提升 (LPE) 漏洞&#xff0c;分别是 CVE-2025-6018 和 CVE-2025-6019。这两个漏洞可以被串联利用&#xff0c;使得非特权用户在几秒钟内获得系统的 root 权限&#xff0c;从而实现对系统的完全控制。 一、漏洞详情 这两…

【Docker基础】Docker镜像管理:docker push详解

目录 引言 1 Docker镜像推送基础概念 1.1 什么是Docker镜像推送 1.2 镜像仓库概述 1.3 镜像标签与版本控制 2 docker push命令详解 2.1 基本语法 2.2 常用参数选项 2.3 实际命令示例 2.4 推送流程 2.5 步骤描述 3 镜像推送实践示例 3.1 登录管理 3.2 标签管理 3…

FPGA基础 -- Verilog行为建模之循环语句

行为级建模&#xff08;Behavioral Modeling&#xff09;是 Verilog HDL 中最接近软件编程语言的一种描述方式&#xff0c;适用于功能建模和仿真建模的初期阶段。在行为级中&#xff0c;循环语句&#xff08;loop statements&#xff09;是常见且重要的控制结构&#xff0c;用于…

从C学C++(7)——static成员

从C学C(7)——static成员 若无特殊说明&#xff0c;本博客所执行的C标准均为C11. static成员和成员函数 对于特定类型的全体对象而言&#xff0c;有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 通常在C中使用全局变量来实现&#xff0c;如果我们…