C++类和对象——构造函数与解析函数介绍

news2024/11/24 17:11:12

目录

1.构造函数和析构函数

1.构造函数,进行初始化

2.析构函数,进行清理

2.构造函数的分类及调用

1.括号法

注意:

2.显示法

3.隐式转化法 

匿名对象

3.拷贝构造函数调用时机

4.构造函数调用规则

1.定义有参构造函数,不提供默认无参构造,会默认提供拷贝构造 

2.定义拷贝构造函数,不会提供其他构造函数


1.构造函数和析构函数

如果我们不写,编译器提供的是空实现 ,即这两种函数存在,但里面什么都没写

1.构造函数,进行初始化

下为代码演示:

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:
	person(){
		cout << "调用了一次";
	}
};

void test(){
	person p;
	//会自动调用一次构造函数
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	test();
	return 0;
}

 

2.析构函数,进行清理

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:
	person(){
		cout << "调用了一次" << '\n';
	}
	~person(){
		cout << "析构函数调用" << endl;
	}
};

void test(){
	person p;
	//会自动调用一次构造函数
	//这是栈上的数据,执行完后会自动释放,在释放前就会自动调用一次析构函数
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	test();
	
	return 0;
}

 

2.构造函数的分类及调用

 

无参构造又叫默认构造 

代码示例:

1.括号法

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:

	int age;
	
	person(){
		cout << "无参构造函数调用" << '\n';
	}
	
	person(int a){
		age = a;
		cout << "有参构造函数调用" << '\n';
	}
	//拷贝构造函数
	person(const person &p){
		//将传入的拷贝到我身上
		age = p.age;
		cout << "拷贝构造函数调用" << '\n';
	}
	~person(){
		cout << "析构函数调用" << endl;
	}
};

void test(){
	//1.括号法
	person p1;
	person p2(10);
	person p3(p2);
	//2.显示法
	//3.隐式转化法
	
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	test();
	
	return 0;
}

 

注意:

1.调用默认函数构造不能

person p()

因为这段话编译器会认为是函数的声明 

2.调用拷贝函数不能person(p3)

编译器会认为这个括号不存在,以为这是一个变量的声明

2.显示法

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:

	int age;
	
	person(){
		cout << "无参构造函数调用" << '\n';
	}
	
	person(int a){
		age = a;
		cout << "有参构造函数调用" << '\n';
	}
	//拷贝构造函数
	person(const person &p){
		//将传入的拷贝到我身上
		age = p.age;
		cout << "拷贝构造函数调用" << '\n';
	}
	~person(){
		cout << "析构函数调用" << endl;
	}
};

void test(){
	//1.括号法
	// person p1;
	// person p2(10);
	// person p3(p2);
	
	//2.显示法
	person p4;
	person p5 = person(10);
	person p6 = person(p5);
	//3.隐式转化法
	
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	test();
	
	return 0;
}

 

3.隐式转化法 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:

	int age;
	
	person(){
		cout << "无参构造函数调用" << '\n';
	}
	
	person(int a){
		age = a;
		cout << "有参构造函数调用" << '\n';
	}
	//拷贝构造函数
	person(const person &p){
		//将传入的拷贝到我身上
		age = p.age;
		cout << "拷贝构造函数调用" << '\n';
	}
	~person(){
		cout << "析构函数调用" << endl;
	}
};

void test(){
	//1.括号法
	// person p1;
	// person p2(10);
	// person p3(p2);
	
	//2.显示法
	// person p4;
	// person p5 = person(10);
	// person p6 = person(p5);
	
	//3.隐式转化法
	person p4 = 10;//相当于 person p4(10)或者person p4 = person(10)
	person p5 = p4;//拷贝构造
	
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	test();
	
	return 0;
}

 

匿名对象

 

3.拷贝构造函数调用时机

 

 

 

 

 

4.构造函数调用规则

 

 

1.定义有参构造函数,不提供默认无参构造,会默认提供拷贝构造 

如下代码,调用了无参构造函数,结果报错了

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:

	int age;
	
	// person(){
		// cout << "无参构造函数调用" << '\n';
	// }
	
	person(int a){
		age = a;
		cout << "有参构造函数调用" << '\n';
	}
	//拷贝构造函数
	person(const person &p){
		age = p.age;
		cout << "拷贝构造函数调用" << '\n';
	}
	~person(){
		cout << "析构函数调用" << endl;
	}
};

void test(){
	person p;
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	test();
	
	return 0;
}

2.定义拷贝构造函数,不会提供其他构造函数

这里调用了无参构造函数,结果报错了

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

class person
{
public:

	int age;
	
	// person(){
		// cout << "无参构造函数调用" << '\n';
	// }
	
	// person(int a){
		// age = a;
		// cout << "有参构造函数调用" << '\n';
	// }
	//拷贝构造函数
	person(const person &p){
		age = p.age;
		cout << "拷贝构造函数调用" << '\n';
	}
	~person(){
		cout << "析构函数调用" << endl;
	}
};

void test(){
	person p;
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	test();
	
	return 0;
}

 

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

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

相关文章

微信小程序之页面导航、生命周期和WXS脚本

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

机器学习的数据库积累........

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md ​​​​​​​ 另一个database:&#xff08;网址:Object Detection Made Easy with TensorFlow Hub: Tutorial&#xff09; Object Detection Made Easy with Ten…

【Java Kubernates】Java调用kubernates提交Yaml到SparkOperator

背景 目前查询框架使用的是trino&#xff0c;但是trino也有其局限性&#xff0c;需要准备一个备用的查询框架。考虑使用spark&#xff0c;spark operator也已经部署到k8s&#xff0c;现在需要定向提交spark sql到k8s的sparkoperator上&#xff0c;使用k8s资源执行sql。 对比 …

RCC——使用HSE/HSI配置时钟

RCC 文章目录 前言一、背景二、仿真计算周期 2.1 2.2 三、MCO引脚输出时钟总结 前言 前期疑问&#xff1a;1、RCC是什么意思。 2、最终配好的72M是系统时钟吗&#xff1f; 3、一共有哪些时钟 本文目标&#xff1a;将PLL时钟配置成72M 疑问解答&#xff1a;最终配好的时钟是…

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 希望大家都能够厚积薄发。 ~~~道理都懂&#xff0c;但有时候做不到&#xff0c;所以还是没真正懂。 前端自动化&am…

【Qt无门槛入门】信号以及信号机制及其常用控件(1)

信号与信号槽 信号源&#xff1a;由哪个控件发出的信号。 信号的类型&#xff1a;用户进行不同的操作&#xff0c;就可能出发不同的信号。 信号处理的方式:槽&#xff08;slot&#xff09;某个对象接收到这个信号之后&#xff0c;就会做一些相关的处理动作。但是Qt对象不会无故…

uniCloud 免费版和商用版

概述 uniCloud为每个开发者提供一个免费的服务空间&#xff0c;更低门槛按量付费是serverless的特色&#xff0c;如果没有消耗硬件资源&#xff0c;就完全不用付款serverless比传统的云主机更便宜传统云主机一旦被攻击&#xff0c;高防价格非常昂贵。而uniCloud无需支付高防费…

零基础学习数学建模——(五)美赛写作指导

本篇博客将详细讲解美赛论文写作。 文章目录 标题摘要目录引言问题背景问题重述前人研究我们的工作 模型假设及符号说明正文问题分析模型建立模型求解结果分析模型检验 模型优缺点及展望模型优缺点模型展望 参考文献及附录参考文献附录 2024年美赛论文新要求 标题 标题要简洁…

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载&#xff1a;MySQL :: Download MySQL Community Server 二、上传软件…

Future模式先给您提货单

Future模式是一种设计模式&#xff0c;用于在处理耗时操作时提高程序的响应性。 角色介绍: Main类: 负责向Host发出请求并获取数据的类。 Host类: 负责向请求返回FutureData的实例的类&#xff0c;起到调度的作用。 Data接口: 表示访问数据的方法的接口&#xff0c;由FutureD…

LabVIEW电液比例阀测试系统

电液比例阀与普通阀和伺服阀相比&#xff0c;比例阀展现出显著的耐污染和可靠性特点。为了满足这些比例阀的综合性能测试需求&#xff0c;开发了一种基于LabVIEW软件的电液比例阀综合性能试验台。这个系统不仅能够进行比例压力阀、流量阀和方向阀的性能测试&#xff0c;而且通过…

STM32-LwESP 移植

LwESP 是一个专门解析 Espressif 公司旗下 ESP 系列芯片 AT 指令的开源库&#xff0c;具有以下特性&#xff1a; 支持 Espressif 公司 ESP32, ESP32-C2, ESP32-C3, ESP32-C6 和 ESP8266 芯片。独立平台&#xff0c;采用 C99 标准编写&#xff0c;易于移植。允许不同的配置来优…

前端大厂面试题探索编辑部——第二期

目录 题目 单选题1 题解 关于TCP 关于UDP 单选题2 题解 A选项的HTTP是否是无状态协议 B选项的HTTP支持的方法 C选项的关于HTTP的状态码 D选项HTTP协议的传输格式 题目 单选题1 1.以下哪个描述是关于 TCP 和 UDP 的区别&#xff08;&#xff09; A. TCP 是无连接的…

大创项目推荐 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

Deeplearning

Numpy Deep Learning Basic 神经网络&#xff1a; #mermaid-svg-2N27H7C0XPrmd8HP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2N27H7C0XPrmd8HP .error-icon{fill:#552222;}#mermaid-svg-2N27H7C0XPrmd8HP .…

【RTP】webrtc 学习2: webrtc对h264的rtp打包

切片只是拷贝帧的split的各个部分到新的rtp 包的封装中。并没有在rtp包本身标记是否为关键帧FU-A 切片 输入的H.264 数据进行split :SplitNalu SplitNalu : 按照最大1200字节进行切分 切分后会返回一个数组 对于FU-A :split的数据总大小是 去掉一个字节的nalu header size …

Linux系统——点菜名

Linux系统可以点菜啦&#xff01; [rootlocalhost ~]#vim menu1.sh #!/bin/bash sum0 PS3"请输入(1-6):" MENU" 宫保鸡丁 酸菜鱼 鱼香肉丝 佛跳墙 水煮肉片 点菜结束 "select menu in $MENU do case $REPLY in 1) echo $menu 价格是20 let sum20 ;; 2) ec…

spacy分词工具下载指南

分享一下spacy分词工具的下载流程&#xff0c;直接在命令行下载速度慢而且一般都成功不了&#xff0c;所以需要像nltk工具一样离线下载&#xff0c;这里记录一下流程。让有需要的同学少走一些坑。 一、下载spacy 这里下载记得使用国内源哟&#xff0c;速度会快很多&#xff0c…

微信小程序(十九)组件通信(子传父)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.定义触发事件向父组件传输数据 2.父组件绑定绑定触发事件并获取数据 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class" style"padding-top: {{test}}px;">&l…

Elasticsearch安装Head图形插件

一、Google浏览器扩展插件方式 1.安装插件 进入谷歌浏览器应用商店搜索“Elasticsearch Head”,点击链接跳转 点击“添加至Chrome”按钮安装即可。 2.使用插件 在浏览器的插件列表多了个一个放大镜图标 点击“New”新建链接,输入es节点或集群地址。 连接成功 可以进行概括…