7、类型转换构造、析构、深拷贝、类的静态成员

1、类型转换构造 |自定义转换

利用一个已定义的对象,来定义另一个不同类型的对象
实现从源类型到目标类型的隐式类型转换的目的

总结下已知构造,包括类型转换构造

如下,如果Person给Human赋值时,Person有私有变量,则需要在Person声明友元声明

private:friend class Human;
class Human{
public://缺省构造/无参构造Human(int age = 0, const char* name="匿名"){//【int m_age;】,定义m_age,初值为随机数//【string m_name;】,定义m_name,利用m_name.string()cout << "Human类的缺省构造函数被调用" << endl;m_age = age;m_name = name;}//拷贝构造 带初始化表Human(const Human& that):m_age(that.m_age),m_name(that.m_name){//【int m_age;】,定义m_age,初值为随机数//【string m_name;】,定义m_name,利用m_name.string()cout << "Human类的拷贝构造函数被调用" << endl;m_age = that.m_age;m_name = that.m_name;}//拷贝赋值Human& operator=(const Human& that){// 编译器不会在自定义拷贝赋值函数中添加任何操作cout << "Human类的拷贝赋值函数被调用" << endl;this->m_age = that.m_age;this->m_name = that.m_name; return *this;}Human(const Person& src):m_age(src.p_age),m_name(src.p_name),m_score(src.p_score){cout << "Human类的类型转换构造函数被调用" << endl;}
private:int m_age;     // 基本类型的成员变量string m_name; // 类类型的成员变量
};

通过explicit关键字,可以强制这种通过类型转换构造函数实现的类型转换必须通过静态转换显式地进行

explicit Human(const Person& src)
:m_age(src.p_age),m_name(src.p_name),m_score(src.p_score){cout << "Human类的类型转换构造函数被调用" << endl;
}

2、析构函数

析构函数的函数名就是在类名前面加~
没有返回类型也没有参数,不能重载

在销毁对象之前一刻自动被调用,且仅被调用一次

  • 对象离开作用域
  • delete操作符

如果一个类没有定义析构函数,那么编译器会为其提供一个默认析构函数

功能

  • 对基本类型的成员变量,什么也不做
  • 对类类型的成员变量,调用相应类型的析构函数
  • 销毁 对象的各个成员变量

对象的销毁过程

自动执行的代码在自定义代码之后执行

  • 调用析构函数
    • 执行自己在析构函数中书写的代码
    • 利用成员变量调用相应的析构函数
    • 释放对象的各成员变量所占内存空间
  • 释放整个对象所占用的内存空间

使用说明

  • 通常情况下,若对象在其生命周期的最终时刻,并不持有任何动态分配的资源,可以不定义析构函数
  • 但若对象在其生命周期的最终时刻,持有动态资源则必须自己定义析构函数,释放对象所持有的动态资源
  • 析构函数的功能并不局限在释放资源上,它可以执行我们希望在对象被释放之前执行的任何操作

3、深拷贝

浅拷贝

无论是拷贝构造还是拷贝赋值,其默认实现对任何类型的指针成员都是简单地复制地址,而并不复制地址指向的数据,这种情况称之为浅拷贝。
浅拷贝的问题:
指向统一内存,free会多次,即delete多次同一内存地址

深拷贝

为了获得完整意义上的对象副本,必须自己定义拷贝构造和拷贝赋值,针对指针型成员变量深拷贝。

防止自赋值

相对于拷贝构造,拷贝赋值需要做更多的工作

  • 避免自赋值
  • 分配新资源
  • 拷贝新内容
  • 释放旧资源
  • 返回自引用

两个建议

  • 只有类中有指针型成员变量时才会涉及深浅拷贝的问题,因此应尽量避免使用指针型成员变量
  • 如果确实无法实现完整意义上的深拷贝拷贝构造和深拷贝拷贝赋值,可将它们私有化,禁止用户使用

类的静态成员

类的静态成员变量和静态成员函数,更象是普通的全局变量和全局函数,只是多了一层类作用域和访问控制限定符的约束,相当于具有成员访问属性的全局变量和全局函数

类的静态成员变量

静态成员变量 不属于对象 而属于类

  • 静态成员变量不包含在对象中,进程级生命期
  • 静态成员变量的定义和初始化,只能在类的外部而不能在构造函数中进行
  • 静态成员变量依然受类作用域和访问控制限定符的约束
  • 访问静态成员变量,既可以通过类也可以通过对象
  • 静态成员变量为该类的所有对象实例所共享

类的静态成员函数

静态成员函数 不属于对象 而属于类

  • 静态成员函数没有this指针,也没有常属性
  • 静态成员依然受类作用域和访问控制限定符的约束
  • 访问静态成员函数,既可以通过类也可以通过对象
  • 静态成员函数只能访问静态成员,而非静态成员函数既可以访问静态成员,也可以访问非静态成员

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

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

相关文章

浅聊JAVA开发下环境部署与使用工具的安装与部署

Java开发环境的部署涉及到安装Java Development Kit&#xff08;JDK&#xff09;、配置系统环境变量、选择一个集成开发环境&#xff08;IDE&#xff09;等步骤。以下是一般情况下的Java开发环境部署步骤&#xff1a; 安装Java Development Kit (JDK): 访问 Oracle JDK下载页面…

qt creator配置opencv库 (MSVC版本)

目录 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 1.4 新建qt项目 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 D:…

Educational Codeforces Round 159 (Div. 2) A~E

A.Binary lmbalance&#xff08;思维&#xff09; 题意&#xff1a; 给出一个01字符串&#xff0c;你可以对字符串进行无限次下列操作&#xff1a; 选择一个位置 i ( 1 ≤ i ≤ ∣ s ∣ − 1 , |s|为字符串s的长度 ) i(1 \le i \le |s| - 1,\text{|s|为字符串s的长度}) i(1≤…

深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图

大家好,我是微学AI,今天给大家介绍一下深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图。本文我将介绍自动驾驶技术及其应用场景,并重点阐述了基于计算机视觉技术下的自动驾驶。自动驾驶技术是一种利用人工智能和…

Linux报too many open files的解决方案及 lsof、sysctl 命令介绍

Too many open files in system 问题处理 服务器异常&#xff1a; 一串的etc下的shell文件报 /etc/profile.d/bash_completion.sh: Too many open files in system 查看当前操作系统允许打开的文件数 # 用户级查看&#xff1a; ulimit -n # 系统级查看&#xff1a; cat /pro…

Java实现屏幕截图程序(二)

本文是继Java实现屏幕截图程序(一)之后进行加工的,主要逻辑是依靠javafx界面进行屏幕范围选择和截图图片显示,在日常工作中较为适用,下面把代码分享给大家。 以下是JavaFX实现的简单选择界面截图程序代码: 屏幕拖动监听器,截图后的界面可拖动就靠它: import javafx.e…

LeetCode刷题--- 计算布尔二叉树的值

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

cache教程1.LRU 缓存淘汰策略

这一节实现LRU算法&#xff0c;要理解明白其使用的数据结构。 FIFO/LFU/LRU 算法简介 Cache的缓存全部存储在内存中&#xff0c;内存是有限的&#xff0c;因此不可能无限制地添加数据。当占用内存超过了给定的内存大小时候&#xff0c;就需要从缓存中移除一条或多条数据了。我…

计算机网络(二)| 物理层上 | 数据通信基础知识 调制 频率范围 信噪比

文章目录 1 物理层基本概念2.数据通信基础知识2.1 数据通信基本概念2.2 信道基本概念2.2.1 基带调制&#xff08;编码&#xff09;方式2.2.2 带通调制方式 2.3 信道的极限速率影响因素2.3.1 **频率范围**2.3.2 **信噪比** 内容笔记来源于谢希任老师《计算机网络》 物理层重点 …

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

rename--一些例子与问题

指令 A 和指令 B之间存在先写后读(RAW)的相关性 指令 B 的源寄存器 r0 来自于指令 A 产生的结果因此在进行寄存器重命名的时候&#xff0c;指令 B 的 r0 对应的物理寄存器应该直接来自于指令A所对应的P30,而不应该来自于从RAT读取的值。指令A,B,D之间存在先写后写(WAW)的相关性…

阿里云效部署前后端

静态站点到OSS 阿里云-云效&#xff0c;阿里云企业级一站式 DevOps&#xff0c;可以免费使用&#xff08;会限制人数、流水线数量等&#xff0c;个人项目够用了&#xff09;。相关文章 CI 持续集成 - 阿里云云效 OSS 是对象存储的意思&#xff0c;一般一个项目对应一个 Bucke…

20231202年江西省“振兴杯”网络信息行业(信息安全测试员)职业技能竞赛

C1-xor chall.py from flag import flagdef encrypt(x, y):keyzxbresultfor i in range(len(x)):resultchr(ord(x[i])^ord(y[i])^ord(key[i%3]))return result x flag y flag[1:] flag[0]enc open(flag.enc, wb) enc.write(encrypt(x, y)) enc.close()简单的异或&#xf…

一个小问题

用paddle的paddleOCR的时候&#xff0c;需要修改部分代码&#xff0c;但是直接Python xx.py不能运行&#xff0c;需要用paddle自己的命令行方式运行&#xff0c;感觉很麻烦啊。 另外工作上遇到像这样的小问题&#xff0c;应不应该去问同事呢&#xff0c;感觉这个问题比较简单但…

使用Jython将Python代码转换为Java可执行文件

步骤1&#xff1a;安装Jython 首先&#xff0c;我们需要安装Jython。可以使用pip命令来安装Jython&#xff1a; pip install jython 步骤2&#xff1a;编写Python代码 第二步是编写你的Python代码。在这个例子中&#xff0c;我们简单地打印出"Hello World!"。你可…

Java API接口强势对接:构建高效稳定的系统集成方案

文章目录 1. Java API接口简介2. Java API接口的优势2.1 高度可移植性2.2 强大的网络通信能力2.3 多样化的数据处理能力 3. 实战&#xff1a;Java API接口强势对接示例3.1 场景描述3.2 用户管理系统3.3 订单处理系统3.4 系统集成 4. 拓展&#xff1a;Java API接口在微服务架构中…

LeetCode:1466. 重新规划路线(DFS C++、Java)

目录 1466. 重新规划路线 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 1466. 重新规划路线 题目描述&#xff1a; n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有…

智能优化算法应用:基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.变色龙算法4.实验参数设定5.算法结果6.参考文献7.…

Revisiting Proposal-based Object Detection阅读笔记

Revisiting Proposal-based Object Detection阅读笔记 论文地址&#xff1a;link Abstract For any object detector, the obtained box proposals or queries need to be classified and regressed towards ground truth boxes. 对于任何物体检测器来说&#xff0c;获得的…

Spring 声明式事务

Spring 声明式事务 1.Spring 事务管理概述1.1 事务管理的重要性1.2 Spring事务管理的两种方式1.2.1 编程式事务管理1.2.2 声明式事务管理 1.3 为什么选择声明式事务管理 2. 声明式事务管理2.1 基本用法2.2 常用属性2.2.1 propagation&#xff08;传播行为&#xff09;2.2.2 iso…