文章目录

  • 一、构造函数
    • 1.1定义
    • 1.2语法
    • 1.3特性
  • 二、析构函数
    • 2.1定义
    • 2.2语法
    • 2.3特性
  • 三、拷贝构造函数
    • 3.1定义
    • 3.2语法
    • 3.3特性
    • 3.4浅拷贝
      • 3.4.1定义
      • 3.4.2浅拷贝的风险
    • 3.5深拷贝

一、构造函数

1.1定义

在C++中,构造函数(Constructor) 是一种特殊的成员函数,用于在创建对象时初始化其成员变量。构造函数的名称必须与类名相同,且没有返回类型(包括 void)。构造函数在对象创建时自动调用,确保对象处于有效状态。

1.2语法

class ClassName {
public:ClassName(){内容}           // 默认构造函数(无参)ClassName(参数列表){内容}           // 带参构造函数// ... 其他成员函数
};

示例:

class Date {
public:Date(){_year = 1970;_month = 1;_day = 1;// 默认构造函数实现。如若未定义则是随机值。}Date(int year, int month, int day){_year = year;_month = month;_day = day;// 带参构造函数}void print() {cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main() {Date d1;           // 调用默认构造函数Date d2(2023, 5, 15); // 调用带参构造函数Date d3{};         // C++11统一初始化方式调用默认构造函数d1.print();  // 输出: 1970-1-1d2.print();  // 输出: 2023-5-15d3.print();  // 输出: 1970-1-1return 0;
}

1.3特性

构造函数的主要任务并不是开空间创建对象,而是初始化对象。 它具有以下特点:

  • 1.函数名与类名相同。
  • 2.无返回值。
  • 3.对象实例化时编译器自动调用对应的构造函数。
  • 4.构造函数可以重载。
  • 5.如果未写构造函数,编译器默认生成的是"类名();"

二、析构函数

2.1定义

在C++中,析构函数(Destructor) 是一种特殊的成员函数,用于在对象生命周期结束时自动执行清理工作(如释放内存、关闭文件等)。它的名称是在类名前加 ~,没有返回类型,也不接受任何参数。一般在有动态内存申请的时候要写析构函数。没动态申请的一般不需要写析构。

2.2语法

class ClassName {
public:~ClassName();  // 析构函数,函数体定义默认没有,也可以自己定义。如下文示例。
};

示例:

class Date {
public:~Date(){cout << "Date对象被销毁" << endl;}
private:int year;int month;int day;
};int main()
{Date a;return 0;
}
//程序结束后会打印"Date对象被销毁"。

2.3特性

  • 1.自动调用。
  • 2.不能重载。

三、拷贝构造函数

3.1定义

拷贝构造函数是构造函数的一种重载形式,专门用于用已存在的对象创建新对象,核心是实现对象的“复制”。它的参数必须是同类对象的引用(通常加 const ,防止意外修改原对象),这是与普通构造函数的关键区别。

3.2语法

class MyClass {
public:// 拷贝构造函数声明MyClass(const MyClass& other);
};// 拷贝构造函数实现
MyClass::MyClass(const MyClass& other) {// 拷贝逻辑
}

3.3特性

  • 1.参数类型:
    ①必须是对同类对象的const引用

    ②使用引用避免无限递归

    ③const确保不修改源对象

  • 2.无返回值:构造函数没有返回类型

  • 3.通常不声明为explicit:允许隐式拷贝构造

3.4浅拷贝

3.4.1定义

  • 1.逐成员复制:简单复制对象的所有非静态成员变量

  • 2.指针共享:对于指针成员,仅复制指针值(地址),不复制指向的内容

  • 3.默认行为:编译器生成的默认拷贝构造函数执行的就是浅拷贝
    示例:

class Time
{
public:Time(){_hour = 1;_minute = 1;_second = 1;}Time(const Time& t)//这就是浅拷贝{_hour = t._hour;_minute = t._minute;_second = t._second;}
private:int _hour;int _minute;int _second;
};

3.4.2浅拷贝的风险

双重释放问题:
假如arr2是arr1的拷贝。
当arr1和arr2离开作用域时:
先调用arr2的析构函数释放内存。
再调用arr1的析构函数再次释放同一内存 → 程序崩溃

3.5深拷贝

深拷贝是指:

  • 1.创建新对象时完全复制所有数据

  • 2.对指针成员分配新内存并复制内容

  • 3.副本与原对象完全独立,不共享任何资源

示例:(栈)

class SafeStack {
private:int* data;int capacity;int topIndex;public:// 构造函数SafeStack(int size): capacity(size), topIndex(-1), data(new int[size]) {}// 深拷贝构造函数SafeStack(const SafeStack& other): capacity(other.capacity),topIndex(other.topIndex),data(new int[other.capacity]) {// 复制栈中所有元素for (int i = 0; i <= topIndex; ++i) {data[i] = other.data[i];}}// 深拷贝赋值运算符SafeStack& operator=(const SafeStack& other) {if (this != &other) {  // 自赋值检查// 创建临时副本int* newData = new int[other.capacity];// 复制数据for (int i = 0; i <= other.topIndex; ++i) {newData[i] = other.data[i];}// 替换旧数据(异常安全)delete[] data;data = newData;capacity = other.capacity;topIndex = other.topIndex;}return *this;}// 移动构造函数(C++11)SafeStack(SafeStack&& other) noexcept: data(other.data),capacity(other.capacity),topIndex(other.topIndex) {other.data = nullptr;other.capacity = 0;other.topIndex = -1;}// 析构函数~SafeStack() {delete[] data;}void push(int value) {if (topIndex == capacity - 1) {throw std::overflow_error("Stack is full");}data[++topIndex] = value;}int pop() {if (topIndex == -1) {throw std::underflow_error("Stack is empty");}return data[topIndex--];}void print() {std::cout << "Stack: [ ";for (int i = 0; i <= topIndex; ++i) {std::cout << data[i] << " ";}std::cout << "]\n";}
};int main() {SafeStack s1(5);s1.push(1);s1.push(2);s1.push(3);// 测试拷贝构造函数SafeStack s2 = s1;  // 深拷贝// 修改s1不影响s2s1.pop();s1.push(99);// 测试赋值运算符SafeStack s3(2);s3 = s1;  // 深拷贝赋值s1.print();  // 输出: Stack: [ 1 2 99 ]s2.print();  // 输出: Stack: [ 1 2 3 ]s3.print();  // 输出: Stack: [ 1 2 99 ]// 测试移动语义SafeStack s4 = std::move(s1);s1.print();  // 输出: Stack: [ ] (已移动)s4.print();  // 输出: Stack: [ 1 2 99 ]return 0;
}

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

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

相关文章

机器学习初学者理论初解

大家好! 为什么手机相册能自动识别人脸&#xff1f;为什么购物网站总能推荐你喜欢的商品&#xff1f;这些“智能”背后&#xff0c;都藏着一位隐形高手——机器学习&#xff08;Machine Learning&#xff09;。一、什么是机器学习&#xff1f;简单说&#xff0c;机器学习是教计…

原码反码补码

在Java中&#xff0c;无论是小数还是整数&#xff0c;他们都要带有符号&#xff08;和C语言不同&#xff0c;C语言有无符号数&#xff09;。首位就作为符号位。原码反码&#xff1a;正数的反码是其原码本身负数的反码是在其原码的基础上, 符号位不变&#xff0c;其余各个位取反…

使用ubuntu:20.04和ubuntu:jammy构建secretflow环境

一、使用ubuntu:20.04构建隐语编译环境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(铰链损失函数)详解:SVM 中的关键损失函数

&#x1f4cc; 一、什么是 Hinge Loss&#xff1f;Hinge Loss&#xff08;铰链损失&#xff09;&#xff0c;是 支持向量机&#xff08;SVM, Support Vector Machine&#xff09; 中常用的一种损失函数&#xff0c;用于最大间隔分类。其核心思想是&#xff1a;当预测结果已经正…

days32 :零基础学嵌入式之网络2.0

一、wireshark &#xff1a;网络抓包工具1.功能&#xff1a;抓取通过电脑网卡的网络数据2.作用&#xff1a;排查故障、抓取数据做数据分析、3.用法&#xff1a;&#xff08;1&#xff09;sudo wireshark&#xff08;2&#xff09;选择需要抓取的网卡》any&#xff08;3&#xf…

数字护网:一次深刻的企业安全体系灵魂演练

&#x1f9e9; 引言&#xff1a;什么是“护网”&#xff1f;—— 不止是攻防&#xff0c;更是企业安全能力的年度大考 每年&#xff0c;由国家相关部门牵头的“护网行动”都如期而至&#xff0c;各大企事业单位的安全团队也随之进入高度戒备状态。然而&#xff0c;“护网”远非…

基于 NumPy 的高效数值计算技术解析与实践指引

在数据处理与科学计算领域&#xff0c;高效是核心诉求。NumPy 作为 Python 生态高效数值计算的基石&#xff0c;以高性能多维数组对象及配套函数&#xff0c;成为数据从业者的必备工具。其数组支持算术、比较、逻辑等丰富运算&#xff0c;通过向量化操作直接处理每个元素&#…

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的选举 在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller)​,它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ImageCarousel(图片轮播组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— ImageCarousel组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 语法以及 Tailwind CSS …

基于springboot的智能物流管理系统(源码+论文)

一、开发环境 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器&#xff0c;基于SQL的客户/服务器模式的关系数据库管理系统。其特点包括&#xff1a; 功能强大&#xff1a;支持多用户、多线程操作。使用简单&#xff1a;管理方便&#xff0c;安全可靠性高。跨平…

Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章

目录 Collection简介 Collection的遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 List集合的遍历方式 列表迭代器遍历以及普通for循环 数据结构 栈 队列 数组 链表 单向链表 双向链表 二叉树 遍历方式 普通二叉树 二叉查找树 平衡二叉树 旋转…

《安顺棒垒球》世界十大运动·棒球1号位

Worlds Top 10 Sports for Newbies | 棒球排第几&#xff1f; 全球青训体系大揭秘 ⚾添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;神王棒球世界十大运动排名 Top 10 Global Sports&#xff08;按参与度/商业价值/影响力综合排序&#xff09;足球 Footba…

什么是“差分“?

1. 什么是"差分"&#xff1f;想象两个人在玩跷跷板&#xff1a;当两人同时向上跳&#xff08;同向移动&#xff09;→ 跷跷板不动 → 这叫"共模"当一人向上&#xff0c;另一人向下&#xff08;反向移动&#xff09;→ 跷跷板倾斜 → 这叫"差分"差…

4.组合式API知识点(2)

10 组合式API - 模版引用模板引用的概念如何使用&#xff08;以获取dom为例 组件同理&#xff09;组件实例对象defineExpose()11 组合式API - provide和inject作用和场景跨层传递普通数据跨层传递响应式数据跨层传递方法需求解决思考

GitLab企业版部署与许可证生成完整指南

GitLab企业版部署与许可证生成完整指南一、背景二、环境准备三、部署步骤1. 创建目录结构2. 生成GitLab许可证2.1 克隆许可证生成器2.2 修改生成器脚本2.3 构建Docker镜像2.4 生成许可证文件3. 创建Docker Compose配置文件4. 启动GitLab容器4.1 初始启动4.2 修改GitLab配置4.3 …

Jenkins 不同节点间文件传递:跨 Job 与 同 Job 的实现方法

在日常的 DevOps 运维实践中&#xff0c;Jenkins 通常被用于串联多个自动化流程&#xff0c;而这些流程往往需要在不同的构建节点&#xff08;agent&#xff09;上执行。例如&#xff0c;在以下场景中&#xff1a; &#x1f4cc; 场景需求描述&#xff08;实际问题&#xff09;…

Java中AQS原理

一、核心架构&#xff1a;AQS抽象队列同步器二、AQS核心机制1. 三大核心组件&#xff1a;state状态变量&#xff1a;volatile int&#xff0c;表示锁状态&#xff08;0未锁定&#xff0c;≥1锁定/重入次数&#xff09;CLH队列&#xff1a;双向链表实现的线程等待队列Node节点&a…

深入理解程序链接机制:静态链接、ELF加载与动态库实现原理

目录 一、静态链接 1、静态链接的基本概念 1. 静态链接实例分析 2. 目标文件分析 3. 关键观察 4. 重定位机制 5. 注意事项 2、静态链接过程详解 1. 目标文件反汇编分析&#xff08;上面已分析&#xff09; 2. 符号表分析 code.o 符号表 hello.o 符号表 3. 链接后的…

python基础复习

复习python基础语法,最好能做到使用python 写一些简单的算法。 1基础基础语法 1.0 输入输出 一个实用的print:format函数print(站点列表 {0}, {1}, 和 {other}。.format(Google, Runoob, other=Taobao)) 站点列表 Google, Runoob, 和 Taobao。print("a", "b…

ZLMediaKit 入门

什么是ZLMediaKit&#xff1f; ZLMediaKit 是一个基于C11的高性能流媒体服务器框架&#xff0c;支持RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV等多种流媒体协议。它具有以下特点&#xff1a; 跨平台支持&#xff08;Linux、Windows、macOS&#xff09; 高性能&#xff0c;支持高…