20240415,构造函数和析构函数,拷贝构造函数调用时机规则

目录

二,对象的初始化和清理

2.1 构造函数和析构函数

2.2 函数分类及调用

2.3 拷贝构造函数调用时机

2.4 构造函数调用规则

二,对象的初始化和清理

2.1 构造函数和析构函数

解决初始化和清理问题,编译器自动调用,如果不提供,编译器提供,但空实现 
构造函数类名(){ };没用返回值也不写VOID,函数名称和类名称相同,可以有参数,可以发生重载,自动调用且只一次调用构造
析构函数:~类名 ( ){ };两点特性同上,无参数且不可重载,程序在对象销毁前自动且仅一次调用析构

#include<iostream>
using namespace std;
//对象的初始化和清理
//构造··,无返,类名,有参,自动
//析构··,无返,类名,无参,自动
class Person
{
public:Person(){cout << "Person 构造函数的调用" << endl;}~Person(){cout << "Person 析构函数的调用" << endl;}
};
void test01()//创建对象,但是没有调用类的函数
{Person p;//局部变量,栈上的数据,TEST01执行完毕后,释放这个对象
}
int main()
{test01();//cout << endl;static Person p1;system("pause");//PAUSE是暂停的意思,此时MAIN函数没有结束,P1没有被释放return 0;//结束main函数,返回0
}
2.2 函数分类及调用

分类::参数:有参&无参构造;类型:普通&拷贝构造
调用方式::括号,显示,隐式转换

#include<iostream>
using namespace std;
class Person
{
public://普通Person()//无参,默认{cout << "Person 无参构造函数的调用" << endl;}Person(int a){age = a;cout << "Person 有参构造函数的调用" << endl;}//拷贝Person(const Person& p)//将传入人的所有属性拷贝到我身上?{age = p.age;cout << "Person 拷贝构造函数的调用" << endl;}~Person(){cout << "Person 析构函数的调用" << endl;}int age;
};
//调用
void test01()
{//括号Person p1;//默认无参     不能加括号,PERSON P1();会被认为是一个函数的声明,不会被认为在创建对象Person p2(10);//有参Person p3(p2);//拷贝//函数结束一起释放cout << "P2年龄是" << p2.age << endl;cout << "P3年龄是" << p3.age << endl;
}
void test02()
{//显示法Person p1;Person p2 = Person(10);//有参构造调用Person p3 = Person(p2);//拷贝··    Person(10);//匿名构造,当前行执行结束后,系统会立即回收匿名对象cout << "aaa" << endl;//Person(p3);//不要用拷贝构造函数,初始化对象,编译器认为  Person (p3)==Person p3;一个对象声明
}
void test03()
{//隐式转换法Person p1 = 10;//Person p1=Person(10)有参Person p2 = p1;//拷贝
}
int main()
{test01();cout << endl;test02();cout << endl;test03();system("pause");return 0;
}
2.3 拷贝构造函数调用时机

使用一个已经创建完毕的对象来初始化一个新对象
值传递的方式给函数参数传值
值方式返回局部对象(有点问题,老师讲的和我的结果有出入,没没有调用成功)-我的编译是将函数返回的PERSON当作一个常量值,而不是一个PERSON

#include<iostream>
using namespace std;
class Person
{
public:Person(){cout << "Person 默认构造函数的调用" << endl;}Person(int a){cout << "Person 有参构造函数的调用" << endl;age = a;}Person(const Person& p){cout << "Person 拷贝构造函数的调用" << endl;age = p.age;}~Person(){cout << "Person 析构函数的调用" << endl;}int age;
};void test01()//使用一个已经创建完毕的对象来初始化一个新对象
{Person p1(20);Person p2(p1);cout << "p2的年龄" << p2.age << endl;
}
void dowork(Person p)
{}
void test02()//值传递的方式给函数参数传值
{Person p;dowork(p);//P对象值传入函数,Person p=p;(隐式转换法,乐)产生形参的时候构造析构了一下?
}
Person dowork2()
{Person p;cout << (int*) & p << endl;//打印地址return p;
}
void test03()//值方式返回局部对象
{Person p(dowork2());//只调用了一次?cout << (int*)&p << endl;Person p1 = dowork2();//还是一次//以上都没用触发拷贝函数,而是默认函数,dowork2()虽然是返回一个Person,但是算值????cout << (int*)&p1 << endl;cout << endl;Person p2(p);//前两个地址相同,P2的地址不同,乐cout << (int*)&p2 << endl;}
int main()
{test01();cout << endl;test02();cout << endl;test03();system("pause");return 0;
}
2.4 构造函数调用规则

默认情况下,C++编译器至少给一个类添加三个函数:默认构造(无参,函数体为空);默认析构(无参,函数体为空);默认拷贝构造,对属性进行值拷贝

规则:如果用户定义有参构造函数,C++不再提供默认无参构造,但会提供默认拷贝构造
如果用户定义拷贝构造函数,C++不会再提供其他构造函数

#include<iostream>
using namespace std;class Person
{
public://Person()//运行test01不能注释如果用户定义有参构造函数,C++不再提供默认无参构造,但会提供默认拷贝构造//{//	cout << "Person 默认构造函数的调用" << endl;//}Person(int a){cout << "Person 有参构造函数的调用" << endl;age = a;}/*Person(const Person& p){cout << "Person 拷贝构造函数的调用" << endl;age = p.age;}*/~Person(){cout << "Person 析构函数的调用" << endl;}int age;
};//void test01()
//{
//	Person p;
//	p.age = 18;
//	Person p1(p);
//	cout << "p1的年龄" << p1.age << endl;
//}
void test02()//运行test02可以注释,
{Person p(20);Person p1(p);cout << "p1的年龄" << p1.age << endl;
}
int main()
{//test01();cout << endl;test02();system("pause");return 0;
}
#include<iostream>
using namespace std;class Person
{
public:/*Person(){cout << "Person 默认构造函数的调用" << endl;}Person(int a){cout << "Person 有参构造函数的调用" << endl;age = a;}*/Person(const Person& p){cout << "Person 拷贝构造函数的调用" << endl;age = p.age;}~Person(){cout << "Person 析构函数的调用" << endl;}int age;
};void test03()//如果用户定义拷贝构造函数,C++不会再提供其他构造函数
{Person p;Person p(10);
}
int main()
{test03();system("pause");return 0;
}

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

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

相关文章

C语言中的数据结构--双向链表

前言 上一节我们已经学习完了单链表&#xff08;单向不带头不循环链表&#xff09;的所有内容&#xff0c;我们在链表的分类里面知道了&#xff0c;链表分为单向的和双向的&#xff0c;那么本节我们就来进行双向链表&#xff08;带头双向循环链表&#xff09;的学习&#xff0c…

【CAD建模号】学习笔记(三):图形绘制区1

图形绘制区介绍 CAD建模号的图形绘制区可以绘制我们所需要的各种3D模型&#xff0c;绘制的图形即为模型对象&#xff0c;包括线、面、体等。 1. 二维图形绘制组 二维图形是建模的基础&#xff0c;大多数复杂的模型都是基于二维图形制作出来的&#xff0c;掌握二维图形的绘制等…

(六)Pandas文本数据 学习简要笔记 #Python #CDA学习打卡

一. 文本数据简介 1&#xff09;定义 指不能参与算术运算的任何字符&#xff0c;也称为字符型数据。如英文字母、汉字、不作为数值使用的数字(以单引号开头)和其他可输入的字符。 文本数据虽不能参加算术运算&#xff0c;但其具有纬度高、量大且语义复杂等特点&#xff0c;因…

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

标定的是相机到雷达的,R3live下面配置的雷达到相机的,所以要把得到外参旋转矩阵求逆,再填入,平移矩阵则取负 港科大livox_camera_calib虽然操作方便&#xff0c;但是使用mid360雷达会有视角问题&#xff08;投影三维点到相机&#xff09;&#xff0c;尝试了很多场景&#xff0c…

node-mysql数据库的下载与安装

01 mysql数据库的安装 网址&#xff1a;mysql.com/downloads/ 打开之后往下翻 点击 MySQL Community (GPL) Downloads 》 点击 MySRL Community Server 再点击 No thanks,just stant my download. 02 安装mysql 03 安装完成之后检查mysql服务是否开启 services.msc 04 启动…

排序算法之基数排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性基数排序O(n*k)O(n*k)O(n*k)O(nk)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b…

实验室三大常用仪器3---交流毫伏表的使用方法(笔记)

目录 函数信号发生器、示波器、交流毫伏表如果连接 交流毫伏表的使用方法 测量值的读数问题 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器2---函数信号发生器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客…

对EKS(AWS云k8s)启用AMP(AWS云Prometheus)监控+AMG(AWS云 grafana)

问题 需要在针对已有的EKS k8s集群启用Prometheus指标监控。而且&#xff0c;这里使用AMP即AWS云的Prometheus托管服务。好像这个服务&#xff0c;只有AWS国际云才有&#xff0c;AWS中国云没得这个托管服务。下面&#xff0c;我们就来尝试在已有的EKS集群上面启用AMP监控。 步…

torch.gather用法详解

torch.gather是PyTorch中的一个函数&#xff0c;用于从源张量中按照指定的索引张量来收集数据。 基本语法如下&#xff0c; torch.gather(input, dim, index, *, sparse_gradFalse, outNone) → Tensor input&#xff1a;输入源张量dim&#xff1a;要收集数据的维度index&am…

2.4G射频收发芯片 KT8P01,非常适合超低功耗(ULP)的无线应用

KT8P01是一颗低成本、高性能的智能2.4 GHz射频收发芯片&#xff0c;内置单片机。KT8P01经过优化&#xff0c;提供了单芯片解决方案&#xff0c;适用于超低功耗&#xff08;ULP&#xff09;的无线应用。处理能力、存储器、低功率振荡器、实时计数器以及一系列省电模式的组合为RF…

SQL连接查询

连接查询&#xff1a; 同时涉及多个表的查询称为连接查询。 SQL中连接查询的主要类型 (1) 交叉连接&#xff08;广义笛卡尔积&#xff09; (2) 等值连接 (3) 自身连接 (4) 内连接 (5) 外连接 1.交叉连接 使用笛卡尔积运算的连接方式 笛卡尔积运算&#xff1a;设A&#xff…

基于Python的LSTM网络实现单特征预测回归任务(PyTorch版)

目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续使用 4、创建时间序列数据 5、划分数据集 6、将数据转化为PyTorch张量 7、将数据加载成迭代器 …

【栈】Leetcode 84. 柱状图中最大的矩形【困难】

柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#…

[阅读笔记1][GPT-3]Language Models are Few-Shot Learners

首先讲一下GPT3这篇论文&#xff0c;文章标题是语言模型是小样本学习者&#xff0c;openai于2020年发表的。 这篇是在GPT2的基础上写的&#xff0c;由于GPT2还存在一些局限&#xff0c;这篇对之前的GPT2进行了一些完善。GPT2提出了多任务学习&#xff0c;也就是可以零样本地用在…

第九、十章 异常、模块、包以及数据可视化

第九章 异常、模块、包 异常 捕获异常 捕获常规异常 # 捕获常规异常 try:f open("D:/abc.txt", "r", encoding "UTF-8") except:print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开&qu…

SpringBoot 配置 jedis 来连接redis

Maven依赖 首先配置 maven依赖&#xff0c;这个依赖&#xff0c;要结合自己的springboot 的版本去选&#xff0c; 如果想要看自己的springboot 版本 在 启动类中去 加入&#xff0c;这两行代码 String version SpringBootVersion.getVersion(); log.info("***SpringBo…

LeetCode:203.移除链表元素

&#x1f3dd;1.问题描述&#xff1a; &#x1f3dd;2.实现代码&#xff1a; typedef struct ListNode ListNode; struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL)return head;ListNode *NewHead,*NewTail;ListNode *pcurhead;NewHeadNewTail…

【C++】C++11右值引用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.什么是左值&&…

HCIP——HCIA回顾(笔记)

OSI OSI -- 开放式系统互联参考模型&#xff08;7层参考模型&#xff09; 应用层 抽象语言 -》编码 表示层 编码-》二进制 会话层 提供应用程序的会话地址 传输层 分段 数据包容量不易过大&#xff0c;否则影响传输效率及共享宽带&#xff1b;分段大小由MTU决定&…

积极探索新质生产力,九河云携手华为云技术交流引领数智跃迁

4月18日&#xff0c;九河云携手华为云举办了华为云SA技术培训会议&#xff0c;培训邀请到华为云技术人员作为主讲人&#xff0c;通过理论讲解与案例结合的方式&#xff0c;围绕ECS和EBS之间的联动&#xff0c;调优和数据保护等方面展开&#xff0c;深入浅出地讲解了基于EBS部署…