C++默认构造函数、普通构造函数、拷贝构造、移动构造、委托构造及析构函数深度解析

目录

        • 一、默认构造函数(Default Constructor)
        • 二、普通构造函数(General Constructor)
        • 三、拷贝构造函数(Copy Constructor)
        • 四、移动构造函数(Move Constructor,C++11)
        • 五、委托构造函数(Delegating Constructor,C++11)
        • 六、析构函数(Destructor)
        • 七、综合示例:完整类设计
        • 八、总结对比
        • 九、最佳实践

C++中的构造函数和析构函数是面向对象编程的核心机制,它们管理对象的生命周期和资源。本文结合C++11及后续标准,深入解析默认构造函数、普通构造函数、拷贝构造函数、移动构造函数、委托构造函数及析构函数的核心特性和应用场景。

一、默认构造函数(Default Constructor)

定义:没有参数或所有参数均有默认值的构造函数。若未显式定义任何构造函数,编译器会自动生成一个空实现的默认构造函数。
特点:

  • 用于初始化对象默认状态
  • 自动生成的条件:类中无任何构造函数时
  • 可手动禁用或显式声明(= default或= delete)
    示例:
class MyClass {
public:MyClass() = default; // 显式声明默认构造函数MyClass(int x = 0) : value(x) {} // 带默认参数的构造函数
private:int value;
};

注意事项:

  • 若存在其他构造函数,编译器不再自动生成默认构造函数
  • 对于含有内置类型成员的对象,默认构造函数不会初始化成员变量(可能产生随机值)
二、普通构造函数(General Constructor)

定义:带参数的构造函数,用于初始化对象的特定状态。支持重载,可通过不同参数组合创建对象。
特点:

  • 通过初始化列表高效初始化成员变量
  • 支持多态初始化,例如std::string(“Hello”)
    示例:
class Student {
public:Student(int id, const string& name) : m_id(id), m_name(name) {} // 初始化列表
private:int m_id;string m_name;
};

应用场景:

  • 需要明确初始化逻辑时(如数据库连接需指定IP和端口)
  • 避免成员变量未初始化导致的未定义行为
三、拷贝构造函数(Copy Constructor)

定义:通过已有对象初始化新对象,形式为ClassName(const ClassName& other)。默认实现为浅拷贝,需手动处理指针成员。
调用时机:

  1. 对象作为函数参数传递(值传递)
  2. 函数返回对象时
  3. 显式拷贝初始化(MyClass obj2 = obj1;)
    深浅拷贝对比:
// 浅拷贝(默认危险行为)
class ShallowCopy {
public:int* data;ShallowCopy(int val) { data = new int(val); }~ShallowCopy() { delete data; } // 潜在双重释放
};// 深拷贝(安全实现)
class DeepCopy {
public:int* data;DeepCopy(const DeepCopy& other) {data = new int(*other.data); // 重新分配内存}
};
四、移动构造函数(Move Constructor,C++11)

定义:通过右值引用(&&)转移资源所有权,避免不必要的拷贝开销。
核心机制:

  • 窃取临时对象或即将销毁对象的资源
  • 将原对象指针置空避免重复释放
  • 需标记为noexcept以支持STL容器优化
    示例:
class String {
public:// 移动构造函数String(String&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr; // 转移后置空原指针}
private:char* data;size_t size;
};

性能优势:

  • 减少动态内存分配次数
  • 在vector::push_back等操作中避免深拷贝
五、委托构造函数(Delegating Constructor,C++11)

定义:通过初始化列表调用同类其他构造函数,减少代码冗余。
规则:

  • 必须通过初始化列表委托
  • 禁止循环委托(如A委托B,B又委托A)
  • 可结合参数默认值实现灵活初始化
    示例:
class Rectangle {
public:// 主构造函数Rectangle(int w, int h) : width(w), height(h) {}// 委托构造:正方形初始化Rectangle(int size) : Rectangle(size, size) {}// 委托构造:默认初始化Rectangle() : Rectangle(0, 0) {}
};
六、析构函数(Destructor)

定义:对象生命周期结束时自动调用,用于释放资源,形式为~ClassName()。
关键特性:

  • 不可重载(每个类唯一)
  • 虚析构函数支持多态删除(virtual ~Base())
  • 默认析构函数不处理动态内存
    资源管理示例:
class FileHandler {
public:FileHandler(const string& path) { file = fopen(path.c_str(), "r"); }~FileHandler() { if(file) fclose(file); // 确保资源释放}
private:FILE* file;
};

注意事项:

  • 含有指针成员的类必须自定义析构函数
  • 析构顺序:派生类→成员对象→基类
七、综合示例:完整类设计
class AdvancedClass {
public:// 默认构造AdvancedClass() : data(nullptr), size(0) {}// 普通构造AdvancedClass(int s) : size(s), data(new int[s]{}) {}// 拷贝构造(深拷贝)AdvancedClass(const AdvancedClass& other) : size(other.size), data(new int[other.size]) {std::copy(other.data, other.data + size, data);}// 移动构造AdvancedClass(AdvancedClass&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr;}// 委托构造AdvancedClass(int a, int b) : AdvancedClass(2) {data[0] = a; data[1] = b;}// 析构函数~AdvancedClass() { delete[] data; }private:int* data;int size;
};
八、总结对比
函数类型语法特征核心作用性能影响
默认构造函数ClassName()基础初始化
普通构造函数带参数定制化初始化
拷贝构造函数const ClassName&对象复制(深/浅拷贝)可能高(深拷贝)
移动构造函数ClassName&&资源转移
委托构造函数构造器链式调用代码复用
析构函数~ClassName()资源释放关键
九、最佳实践
  1. Rule of Five:若自定义拷贝构造/赋值、移动构造/赋值、析构函数中的任意一个,建议显式定义全部五个。
  2. RAII原则:通过构造函数获取资源,析构函数释放资源。
  3. 移动语义优先:对临时对象使用std::move触发移动语义。
  4. 委托构造优化:减少重复初始化代码。

通过合理运用这些特性,可构建高效、安全的C++对象模型,尤其在资源管理、高性能计算等场景中体现关键价值。

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

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

相关文章

JVM 深度解析

一、JVM 概述 1.1 什么是 JVM? JVM(Java Virtual Machine,Java 虚拟机)是 Java 程序运行的核心引擎。它像一个“翻译官”,将 Java 字节码转换为机器能理解的指令,并管理程序运行时的内存、线程等资源。 …

OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模块中的一个工厂函数,用于创建一个计算图像导数的滤波器。这个滤波器可以用来计算图像…

Spring Boot 接口开发实战指南

Spring Boot 接口开发实战指南 一、基础接口开发步骤 1.1 添加必要依赖 <!-- pom.xml --> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depen…

题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形

题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形 时间限制: 2s 内存限制: 192MB 提交: 494 解决: 206 题目描述 小蓝要画一个 2025 图形。图形的形状为一个 h w 的矩形&#xff0c;其中 h 表示图形的高&#xff0c;w 表示图形的宽。当 h 5,w 10 时&#xff0c;图形如下所…

UML 时序图 使用案例

UML 时序图 UML 时序图 (Sequence Diagram)时序图的主要元素消息类型详解时序图示例时序图绘制步骤时序图的应用场景 UML 时序图 (Sequence Diagram) 时序图是UML(统一建模语言)中用于展示对象之间交互行为的动态视图&#xff0c;它特别强调消息的时间顺序。 时序图的主要元素…

PPT连同备注页(演讲者模式)一块转为PDF

首先&#xff0c;进入创建PDF/XPS&#xff1a; 然后进入选项&#xff1a; 发布选项-发布内容里选备注页&#xff1a; 导出的原始结果是这样的&#xff1a; 这个时候裁剪一下&#xff0c;范围为所有页面&#xff1a; 最终结果&#xff1a; 如果导出不选“备注页”而是只勾选“包…

AI时代新词-多模态(Multimodal)

一、什么是多模态&#xff08;Multimodal&#xff09;&#xff1f; 多模态&#xff08;Multimodal&#xff09;是指在人工智能中&#xff0c;融合多种不同类型的信息&#xff08;如文本、图像、语音、视频等&#xff09;进行处理和分析的技术。与传统的单一模态&#xff08;例…

【图像大模型】Stable Diffusion XL:下一代文本到图像生成模型的技术突破与实践指南

Stable Diffusion XL&#xff1a;下一代文本到图像生成模型的技术突破与实践指南 一、架构设计与技术演进1.1 核心架构革新1.2 关键技术突破1.2.1 双文本编码器融合1.2.2 动态扩散调度 二、系统架构解析2.1 完整生成流程2.2 性能指标对比 三、实战部署指南3.1 环境配置3.2 基础…

图像分割技术的实现与比较分析

引言 图像分割是计算机视觉领域中的一项基础技术&#xff0c;其目标是将数字图像划分为多个图像子区域&#xff08;像素的集合&#xff09;&#xff0c;以简化图像表示&#xff0c;便于后续分析和理解。在医学影像、遥感图像分析、自动驾驶、工业检测等众多领域&#xff0c;图…

摩尔线程S4000国产信创计算卡性能实战——Pytorch转译,多卡P2P通信与MUSA编程

简介 MTT S4000 是基于摩尔线程曲院 GPU 架构打造的全功能元计算卡&#xff0c;为千亿规模大语言模型的训练、微调和推理进行了定制优化&#xff0c;结合先进的图形渲染能力、视频编解码能力和超高清 8K HDR 显示能力&#xff0c;助力人工智能、图形渲染、多媒体、科学计算与物…

「从0到1」构建工业物联网监控系统:ARM+Quarkus+Prometheus技术栈全记录

在工业4.0浪潮中&#xff0c;边缘计算正成为智能制造的核心基础设施。ARM架构边缘计算机凭借其低功耗、高能效比和模块化设计优势&#xff0c;正在重塑工业物联网&#xff08;IIoT&#xff09;的监控体系。当Java的跨平台能力与Prometheus的实时监控体系相结合&#xff0c;为工…

【HW系列】—web常规漏洞(文件上传漏洞)

文章目录 一、简介二、危害三、文件检测方式分类四、判断文件检测方式五、文件上传绕过技术六、漏洞防御措施 一、简介 文件上传漏洞是指Web应用程序在处理用户上传文件时&#xff0c;未对文件类型、内容、路径等进行严格校验和限制&#xff0c;导致攻击者可上传恶意文件&…

如何设计ES的冷热数据分离架构?Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?

以下为Elasticsearch架构设计与高可用方案详细说明&#xff1a; 冷热架构 一、冷热数据分离架构设计&#xff08;文字描述模拟架构图&#xff09; [Hot Layer] │ ├─ SSD节点组&#xff08;3节点&#xff09; │ ├─ 角色&#xff1a;ingest/data/hot │ ├─ 存…

Trivy 镜像漏洞扫描:从零入门到实战指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——手把手带你掌握容器安全核心工具 一、安装配置&#xff1a;三步完成 Trivy 部署 Trivy 是由 Aqua Security 开发的开源容器安全工具&#xff0c;支持…

SQL基础概念以及SQL的执行方式

1. SQL入门 1.1. SQL语言功能 可以把 SQL 语言按照功能划分成以下的 4 个部分&#xff1a; DDL&#xff0c;英文叫做 Data Definition Language&#xff0c;也就是数据定义语言&#xff0c;它用来定义我们的数据库对象&#xff0c;包括数据库、数据表和列。通过使用 DDL&…

Rust 1.0 发布十周年,梦想再度扬帆起航!

目录 引言&#xff1a;发布十周年&#xff0c;锋芒露今朝 一、Rust的诞生&#xff1a;源于安全的初心 二、Rust 1.0&#xff1a;十年耕耘&#xff0c;硕果累累 三、核心利器&#xff1a;安全、并发与性能的十年锤炼 四、生态与应用&#xff1a;十年拓展&#xff0c;遍地开…

x86 与 ARM 汇编深度对比:聚焦 x86 汇编的独特魅力

一、引言 汇编语言是硬件与软件的桥梁&#xff0c;x86 和 ARM 作为两大主流架构&#xff0c;其汇编语言在设计理念、指令集、编程风格上差异显著。本文以 x86 汇编为核心&#xff0c;结合与 ARM 的对比&#xff0c;解析 x86 汇编的技术细节与应用场景&#xff0c;助力开发者深…

入驻面包多了

前言 入驻面包多了&#xff0c;其实已经开通面包多账号老久了&#xff0c;一直没有认证&#xff0c;因为没什么拿得出手的作品。 后边会努力沉淀&#xff0c;希望能出一些作品&#xff0c;给大家带来一些帮助&#xff0c;然后能赚到一些些奶茶钱。 一个小工具 上架了一个Win…

Python----目标检测(MS COCO数据集)

一、MS COCO数据集 COCO 是一个大规模的对象检测、分割和图像描述数据集。COCO有几个 特点&#xff1a; Object segmentation&#xff1a;目标级的分割&#xff08;实例分割&#xff09; Recognition in context&#xff1a;上下文中的识别&#xff08;图像情景识别&#xff0…

【Spring AI集成实战】基于NVIDIA LLM API构建智能聊天应用:从配置到函数调用全解析

【Spring AI集成实战】基于NVIDIA LLM API构建智能聊天应用&#xff1a;从配置到函数调用全解析 前言 在人工智能应用开发领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的集成能力至关重要。NVIDIA作为全球领先的GPU厂商&#xff0c;其LLM API提供了对Meta Llama-3.…