C++默认六大默认函数

YOLO11实战:手把手教你优化钢材表面缺陷识别模型(基于NEU-DET数据集) 本文详细介绍了如何使用YOLO11优化钢材表面缺陷识别模型,基于NEU-DET数据集进行实战训练。从数据增强、模型架构优化到训练过程控制,全面解析提升钢材缺陷检测性能的关键技术,特别针对裂纹、划痕等典型缺陷提出针对性解决方案。 阅读详情

在C++11及以后的标准中,一个空类(未显式定义任何成员函数)会被编译器自动生成6个默认成员函数;C++11新增了2个(移动构造、移动赋值),C++03及更早版本只有4个。

一、完整默认函数列表(C++11+)

按功能和常用度排序,每个函数的核心信息如下:

函数类型函数原型(以class T为例)生成条件核心作用
1. 默认构造函数T::T()未显式定义任何构造函数创建对象时初始化(空类的默认构造函数啥也不做,仅保证对象能被创建)
2. 析构函数T::~T()未显式定义析构函数对象销毁时清理资源(如释放动态内存、关闭文件)
3. 拷贝构造函数T::T(const T& other)未显式定义拷贝构造函数用已有对象创建新对象(如T a = b),默认是浅拷贝
4. 拷贝赋值运算符重载T& T::operator=(const T& other)未显式定义拷贝赋值运算符已有对象间赋值(如a = b),默认是浅拷贝
5. 移动构造函数(C++11)T::T(T&& other)未显式定义移动构造/拷贝构造/拷贝赋值/析构用临时对象(右值)创建新对象,“窃取”临时对象的资源(避免深拷贝,提升效率)
6. 移动赋值运算符(C++11)T& T::operator=(T&& other)未显式定义移动赋值/拷贝构造/拷贝赋值/析构临时对象赋值给已有对象,同样“窃取”资源

二、关键函数详解(新手重点掌握前4个)

1. 默认构造函数
  • 生成条件:只要你显式定义了任何构造函数(比如带参构造),编译器就不会生成默认构造函数;
  • 示例:
    class Goods {
    public:
        // 显式定义带参构造,编译器不再生成默认构造
        Goods(const char* name) {}
    };
    
    Goods g1; // 编译错误!没有默认构造函数
    Goods g2("苹果"); // 正确,调用带参构造
    
  • 修复:如需默认构造,可手动定义或用=default(C++11):
    Goods() = default; // 显式要求编译器生成默认构造
    
2. 析构函数
  • 默认行为:空类的默认析构函数啥也不做;如果类有动态内存(如char* mName),必须手动定义析构函数释放内存,否则会内存泄漏;
  • 注意:析构函数不能重载,一个类只有一个析构函数。
3. 拷贝构造函数 vs 拷贝赋值运算符
  • 核心区别:
    • 拷贝构造:创建新对象(T a = b),对象生命周期从无到有;
    • 拷贝赋值:已有对象赋值(a = b),对象已存在;
  • 默认浅拷贝的坑:如果类有指针成员(如char* mName),浅拷贝会让两个对象的指针指向同一块内存,析构时会重复释放,导致程序崩溃。
4. 移动构造/移动赋值(C++11进阶)
  • 核心优势:针对临时对象(如Goods("香蕉")),移动构造直接“拿走”临时对象的内存指针,而非深拷贝,效率极高;
  • 触发场景:仅对右值(临时对象、std::move转换的对象)生效:
    Goods g1("苹果");
    Goods g2 = std::move(g1); // 调用移动构造,g1的资源被转移,之后g1不应再使用
    

三、如何禁用默认函数

如果不想让编译器生成某个默认函数(比如禁止拷贝),可显式删除(C++11):

class NonCopyable {
public:
    // 禁用拷贝构造和拷贝赋值
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;

    // 保留默认构造
    NonCopyable() = default;
};

四、新手易混点

  1. 空类不是真的“空”:即使你只写class A {};,编译器也会自动生成6个默认函数(C++11);
  2. 显式定义一个,影响一批:比如显式定义析构函数后,编译器不再生成移动构造/移动赋值;
  3. 浅拷贝仅对POD类型安全:POD类型(如int、固定数组)浅拷贝没问题,指针/动态内存必须手动实现深拷贝。

总结

  1. 核心数量:C++11+有6个默认函数(默认构造、析构、拷贝构造、拷贝赋值、移动构造、移动赋值),C++03有4个(无移动相关);
  2. 生成规则:显式定义某类函数后,编译器不再生成对应的默认版本;
  3. 关键坑点:默认拷贝/赋值是浅拷贝,动态内存成员必须手动实现深拷贝,否则会内存泄漏/重复释放;
  4. 进阶优化:移动构造/赋值可提升临时对象的处理效率,是现代C++的优化手段。
    。

完整实现代码(包含所有6个默认函数)

#include <iostream>
#include <cstring>
#include <utility> // 用于std::swap
using namespace std;

class Cgoods {
private:
    char* mName;    // 动态分配内存
    float m_price;

public:
    // 1. 默认构造函数(无参构造)
    // 用=default显式声明,强调这是编译器生成的默认行为(也可手动实现,效果一致)
    Cgoods() : mName(nullptr), m_price(0.0f) {
        cout << "无参构造函数调用" << endl;
    }

    // 2. 带参构造函数(自定义,编译器不会生成)
    Cgoods(const char* name, float price) : m_price(price) {
        if (name == nullptr) {
            mName = new char[1];
            mName[0] = '\0';
        } else {
            mName = new char[strlen(name) + 1];
            strcpy(mName, name);
        }
        cout << "带参构造函数调用:" << mName << endl;
    }

    // 3. 拷贝构造函数(深拷贝)
    Cgoods(const Cgoods& other) {
        // 分配新内存,避免浅拷贝
        mName = new char[strlen(other.mName) + 1];
        strcpy(mName, other.mName);
        m_price = other.m_price;
        cout << "拷贝构造函数调用:" << mName << endl;
    }

    // 4. 拷贝赋值运算符重载(深拷贝,防泄漏)
    Cgoods& operator=(const Cgoods& other) {
        // 防止自赋值
        if (this == &other) {
            return *this;
        }

        // 释放旧内存 → 分配新内存 → 拷贝数据
        delete[] mName;
        mName = new char[strlen(other.mName) + 1];
        strcpy(mName, other.mName);
        m_price = other.m_price;

        cout << "拷贝赋值运算符重载调用:" << mName << endl;
        return *this;
    }

    // 5. 移动构造函数(C++11新增,“窃取”临时对象资源)
    Cgoods(Cgoods&& other) noexcept { // noexcept:声明不抛异常,提升容器兼容性
        // 直接接管临时对象的资源,无需重新分配内存
        mName = other.mName;
        m_price = other.m_price;

        // 将源对象的指针置空,避免析构时重复释放
        other.mName = nullptr;
        other.m_price = 0.0f;

        cout << "移动构造函数调用:" << mName << endl;
    }

    // 6. 移动赋值运算符重载(C++11新增,赋值时窃取资源)
    Cgoods& operator=(Cgoods&& other) noexcept {
        // 防止自赋值(移动自赋值无意义,但仍需防护)
        if (this == &other) {
            return *this;
        }

        // 释放当前对象的旧内存
        delete[] mName;

        // 接管临时对象的资源
        mName = other.mName;
        m_price = other.m_price;

        // 源对象指针置空
        other.mName = nullptr;
        other.m_price = 0.0f;

        cout << "移动赋值运算符重载调用:" << mName << endl;
        return *this;
    }

    // 7. 析构函数(释放动态内存)
    ~Cgoods() {
        if (mName != nullptr) {
            cout << "析构函数调用:释放 " << mName << " 的内存" << endl;
            delete[] mName;
            mName = nullptr;
        }
    }

    // 辅助函数:打印商品信息
    void showInfo() const {
        cout << "商品名称:" << (mName ? mName : "空") << ",价格:" << m_price << endl;
    }
};

// 测试代码(覆盖所有6个默认函数的调用场景)
int main() {
    cout << "===== 1. 测试默认构造 + 带参构造 =====" << endl;
    Cgoods goods1; // 默认构造
    Cgoods goods2("苹果", 9.9f); // 带参构造
    goods2.showInfo();

    cout << "\n===== 2. 测试拷贝构造 =====" << endl;
    Cgoods goods3 = goods2; // 拷贝构造(新对象创建)
    goods3.showInfo();

    cout << "\n===== 3. 测试拷贝赋值 =====" << endl;
    goods1 = goods3; // 拷贝赋值(已有对象赋值)
    goods1.showInfo();

    cout << "\n===== 4. 测试移动构造 =====" << endl;
    Cgoods goods4 = Cgoods("香蕉", 5.9f); // 移动构造(临时对象初始化新对象)
    goods4.showInfo();

    cout << "\n===== 5. 测试移动赋值 =====" << endl;
    goods1 = std::move(goods4); // 移动赋值(将goods4的资源转移给goods1)
    goods1.showInfo();
    goods4.showInfo(); // goods4已失去资源,变为空

    return 0;
}

关键新增函数解析

1. 移动构造函数(Cgoods(Cgoods&& other) noexcept)
  • 核心作用:针对临时对象(右值) 初始化新对象时,直接“窃取”临时对象的资源(如mName指向的内存),无需重新分配内存,大幅提升效率。
  • 关键细节:
    • 参数是Cgoods&&(右值引用),仅匹配临时对象或std::move转换的对象;
    • noexcept:声明函数不会抛出异常,这是标准要求(容器如vector会优先使用带noexcept的移动构造);
    • 接管资源后,必须将源对象的mName置空,否则源对象析构时会释放已转移的内存,导致崩溃。
2. 移动赋值运算符重载(operator=(Cgoods&& other) noexcept)
  • 核心作用:已有对象赋值时,接管临时对象/std::move对象的资源,逻辑和移动构造一致:
    1. 释放当前对象的旧内存;
    2. 接管源对象的资源;
    3. 源对象指针置空;
    4. 返回自身引用,支持链式赋值。

运行结果(验证所有函数调用)

===== 1. 测试默认构造 + 带参构造 =====
无参构造函数调用
带参构造函数调用:苹果
商品名称:苹果,价格:9.9

===== 2. 测试拷贝构造 =====
拷贝构造函数调用:苹果
商品名称:苹果,价格:9.9

===== 3. 测试拷贝赋值 =====
拷贝赋值运算符重载调用:苹果
商品名称:苹果,价格:9.9

===== 4. 测试移动构造 =====
带参构造函数调用:香蕉
移动构造函数调用:香蕉
商品名称:香蕉,价格:5.9

===== 5. 测试移动赋值 =====
移动赋值运算符重载调用:香蕉
商品名称:香蕉,价格:5.9
商品名称:空,价格:0

析构函数调用:释放 香蕉 的内存
析构函数调用:释放 苹果 的内存
析构函数调用:释放 香蕉 的内存
析构函数调用:释放 苹果 的内存

核心知识点补充

1. 默认函数的生成规则
  • 如果你手动实现了拷贝构造/拷贝赋值/析构函数,编译器不会自动生成移动构造/移动赋值;
  • 如果你手动实现了移动构造/移动赋值,编译器不会自动生成拷贝构造/拷贝赋值;
  • 代码中我们手动实现了所有6个函数,覆盖了所有场景。
2. 移动语义的触发场景
  • 移动构造:用临时对象初始化新对象(如Cgoods g = Cgoods("香蕉", 5.9f));
  • 移动赋值:用std::move将左值转为右值(如g1 = std::move(g4)),或赋值临时对象(如g1 = Cgoods("香蕉", 5.9f))。
3. 移动后的对象状态
  • 移动后,源对象(如goods4)会被置为空(mName=nullptr),此时对源对象的唯一安全操作是:赋值新值或析构,不要访问其原有资源。

总结

  1. 完整默认函数:代码包含C++11标准下的6个默认成员函数(默认构造、带参构造(自定义)、拷贝构造、拷贝赋值、移动构造、移动赋值、析构);
  2. 移动语义核心:移动构造/赋值通过“窃取”资源提升效率,避免深拷贝,是现代C++的优化核心;
  3. 安全要点:移动后必须将源对象指针置空,析构函数要判断nullptr,防止重复释放/野指针;
  4. 使用场景:拷贝构造/赋值用于已有对象的复用,移动构造/赋值用于临时对象的高效转移。
Windows下用Docker快速搭建SearXNG私有搜索引擎(附Dify集成配置) 本文详细介绍了在Windows环境下使用Docker快速搭建SearXNG私有搜索引擎的完整流程,包括环境准备、容器化部署、安全配置优化以及与Dify平台的深度集成方法。通过分步指导和实用配置示例,帮助开发者构建兼具隐私保护和AI增强能力的本地化搜索解决方案,特别适合需要定制化搜索服务的应用场景。 阅读详情

相关推荐

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2919

C++ 内置函数完全指南

C++ **内置函数**(也称为**内建函数**或**编译器内置函数**)是编译器直接提供的函数,无需包含任何头文件即可使用。这些函数通常与硬件架构密切相关,能够提供高性能的低级操作,如位操作、原子操作、数学运算等。掌握内置函数对于编写高效C++代码至关重要。

as_asdf的博客 986

自动驾驶仿真(二)—— 基于PreScan与Simulink的联合仿真

自动驾驶仿真软件介绍二—— PreScan与Simulink联合仿真1. Prescan仿真软件2. Prescan与Simulink联合仿真2. 1 Prescan和matlab软件安装2. 2 联合仿真配置3. 联合仿真实例3.1 一辆不按法规行驶的小车3.2 另一辆的正常行驶的小车3.3 视觉辅助摄像机3.4 传感器检测4. 系列学习视频教程5. 参考学习的书目教材 上一篇博文简单介绍了Carsim与Simulink联合仿真,接着这篇就再继续简单介绍另一款自动驾驶仿真软件Prescan,并且简单做个P

zhudj08的博客 1万+

[技巧]编译器自带的函数

注意:set/map自带的iterator lower_bound (const value_type& val);函数比下面这个块十倍 template <class ForwardIterator, class T, class Compare> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T&

wulalalawu的博客 271

树莓派视觉小车实战:OpenCV驱动的智能物体追踪系统

本文详细介绍了如何从零开始构建一个基于树莓派的智能视觉小车,实现物体跟踪功能。通过OpenCV进行图像处理,结合颜色与轮廓识别算法,让小车能够实时锁定并追踪特定目标。内容涵盖硬件搭建、软件环境配置、核心代码解析及运动控制逻辑,为创客和开发者提供了完整的实战指南。

weixin_29047545的博客 142

H265/HEVC视频分层码流分析语义元素解释

一、H265概述 H265/HEVC(Hight Efficiency Video Coding)是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准,主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行了详细的分析,本文继续从数据处理的角度对H265/HEVC视频码流进行详细分析。 二、H265分层结构 H265的分层结构与H264类似,分为视频编码层(VCL:Video Code Layer)和网络抽象层(NAL

weixin_43876729的博客 9431

C++空类编译器自动生成的6个成员函数

一、问题        在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 二、详解 1、空类,编译器不会生成任何成员函数         对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符。         有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:一个缺省的构造函数、一个

乌托邦 1万+

msc和gcc编译器的内置函数(Compiler Intrinsics/Built-in Functions)

msc和gcc编译器都提供了丰富的内置函数,虽然函数名各有不同,但总是有不少共通的内容,对于跨平台开发非常有用,善用这些函数,可以提高程序的效率同时也减少开发工作量。 msc的内置函数叫Compiler Intrinsics,相关文档在这里 Compiler Intrinsics(点击打开链接) gcc的内置函数叫Built-in Functions,相关的文档在这里Built-in Funct

10km的专栏 4012

低速信号设计之 LPC 篇

摘要:LPC总线作为服务器低速信号设计的关键技术,在BIOS芯片连接、Super I/O芯片控制和嵌入式管理等方面发挥着重要作用。其采用33MHz时钟频率和4位并行传输机制,理论速率达16.5MB/s。设计时需重点关注布线长度(建议<10cm)、信号完整性(45°走线、合理层间隔离)和过孔优化等要点。典型应用案例表明,通过规范设计可确保在工业控制等复杂环境中稳定工作。LPC总线凭借低成本、低引脚数和良好兼容性,仍是服务器低速外设连接的重要解决方案。

qq_16237389的博客 1164

【Python基础】01 如何安装Python及集成环境

本文详细介绍了Python 3.13开发环境的完整搭建流程,涵盖三大操作系统(Windows/macOS/Linux)的Python安装方法、PyCharm专业IDE的配置使用,以及pip包管理工具的应用技巧。内容包括:Python 3.13各系统安装指南、PyCharm社区版与专业版的安装配置、环境验证方法、pip的基本命令与镜像源优化、虚拟环境管理,以及常见问题的解决方案。通过本教程,读者可获得一个高效完备的Python开发环境,为后续编程学习打下坚实基础。

nmdbbzcl的博客 1416

C++编译器生成的默认函数

C++编译器生成的默认函数 话题引入: 对象的赋值与复制是如何进行的?他们的区别是什么?如果一个空的自定义类型能否执行这些操作? 对象赋值:通过“ = ”运算符重载 User a(10),b; b = a; 对象复制:调用拷贝构造函数 User b; User a(b); 或者 User a = b;  //相当于User a(b); 也是调用拷贝构造函数   二者的区

流星之光的专栏 2957

【YOLOv10改进[Backbone]】使用ADNet改进YOLOv10在噪声干扰下的目标检测效果(图像去噪)+ 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

使用ADNet改进YOLOv10在噪声干扰下的目标检测效果(图像去噪)+ 含全部代码和详细修改方式 + 手撕结构图 + 全网首发 + 遥遥领先

静谧、淡雅 2856

C++六大默认成员函数

C++六大默认成员函数

qq_67693066的博客 2276

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

编译器默认生成的c++类六大成员函数

当你遵循“零法则”时,你的类(即使非空)也能像空类一样,让编译器为其生成正确、高效的特殊成员函数。这些标准库组件本身已经完美地实现了“五法则”,你的类只需组合它们,就能自动获得正确的资源管理行为。这使得代码更简洁、更安全、更易于维护。

u011743621的博客 833

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

2、【C++】类的六大默认成员函数

如果用户没有显式定义拷贝构造函数,编译器会生成默认拷贝构造函数,其行为是浅拷贝对于内置类型成员变量:直接拷贝值。对于自定义类型成员变量:调用其拷贝构造函数。int _month;int _day;// 调用编译器生成的默认拷贝构造函数(浅拷贝)return 0;深拷贝是指不仅拷贝指针地址,还拷贝指针指向的内容(重新申请内存并复制数据),避免多个对象共用资源。

gamblerofdestinyR14的博客 915

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++类的六大默认成员函数解析

管理动态内存的类:必须显式定义拷贝构造函数、赋值运算符和析构函数有特殊初始化需求的类:需要显式定义构造函数需要特殊地址处理的情况:需要重载取地址操作符C++通过这六大默认成员函数提供了完整的对象生命周期管理机制。理解每个函数的作用、调用时机和默认行为对于编写正确、高效的C++代码至关重要。在实际开发中,应该根据类的具体需求决定是否需要显式定义这些函数,特别是对于涉及资源管理的类,正确实现这些函数是避免内存泄漏和其他资源问题的关键。

yu____yuan的博客 315

【C++】六大默认成员函数

C++六大默认成员函数

qq_35065724的博客 727

C++类六大函数、空类默认有的成员函数

一 C++类六大成员函数 构造函数、析构函数、拷贝构造函数、移动构造函数、拷贝赋值、移动赋值。 以class A为例: // C++ 类的六大成员函数 class A { public: // 1. 构造函数 A(); // 2. 析构函数 ~A(); // 3. 拷贝构造函数 A(const A &); // 4. 移动构造函数 ...

WSG的博客--盛年不重来,一日难再晨.及时当勉励,岁月不待人. 1250

《C++初阶之类和对象》【类的六大默认成员函数】

C++ 中的类会自动生成六个默认成员函数,这些函数确保类的基本功能。默认构造函数:用于创建对象并初始化成员变量。如果没有定义任何构造函数,编译器会生成一个。拷贝构造函数:用于复制一个已有对象到新对象,通常在传递参数或返回对象时使用。拷贝赋值运算符:用于将一个对象的值赋值给另一个对象,通过运算符实现。移动构造函数:从右值对象移动资源到新对象,优化资源使用,C++11 及以上版本支持。移动赋值运算符:通过移动资源实现对象赋值,同样在 C++11 及以上版本中可用。析构函数。

likuoelie的博客 1063

【C++】类和对象——六大默认成员函数

本篇文件讲解的是类的默认六大成员函数:构造函数、析构函数、拷贝构造函数、赋值重载函数、取地址以及const取地址重载函数,这六大成员函数的特性以及小知识点非常多,我们也讲到了构造函数与析构函数的顺序问题。

malloc不出对象的博客 980

[C++]六大默认成员函数详解

(C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

fighting小泽的博客 1983

详解C++中类的六大默认成员函数

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。资源包括动态开辟的空间,文件的关闭等。C++11中针对内置类型不处理初始化为随机值的问题,打了补丁:内置类型成员变量在类中声明可以给默认值,甚至可以给动态开辟的缺省值,缺点是不能判断空间是否开辟成功。这个特性不能解决对象的多种初始化方式(这也是构造函数支持重载的原因),构造函数该写还是得自己写。默认构造函数:无参的构造函数或全缺省的构造函数,二者只能存在一个,同时存在类中,调用时会出现二义性。

raoxiaoz0425的博客 166
上一篇: C++成员变量的初始化顺序由它们在类中的声明顺序决定,而不是初始化列表中的顺序
下一篇: C++ 取地址符相关的默认函数
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值