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

目录

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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年全球软件开发大会(QCon广州站2023):核心内容与学习收获(附大会核心PPT下载)

在全球化的科技浪潮中&#xff0c;软件开发行业日新月异&#xff0c;持续推动着社会经济的飞速发展。本次峰会以“引领未来&#xff0c;探索无限可能”为主题&#xff0c;聚焦软件开发领域的最新技术、最佳实践和创新思想。来自世界各地的顶级专家、企业领袖和开发者齐聚一堂&a…

【极数系列】Linux环境搭建Flink1.18版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

【解决】IntelliJ IDEA 重命名 Shift + F6 失效

IntelliJ IDEA 重命名 Shift F6 失效 问题解决 问题 Idea 重命名 Shift F6 &#xff0c;一直没反应 解决 调查发现原因是微软新版的输入法冲突了。需要设置【使用以前版本的微软拼音输入法】解决兼容性。 设置 -> 时间和语言 -> 区域 -> 语言选项 -> 键盘选项…

【开源】基于JAVA语言的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

SpringBoot 配置类解析

全局流程解析 配置类解析入口 postProcessBeanDefinitionRegistry逻辑 processConfigBeanDefinitions逻辑 执行逻辑解析 执行入口 ConfigurationClassPostProcessor.processConfigBeanDefinitions()方法中的do while循环体中 循环体逻辑 parse方法调用链 doProcessConfigurat…

C#,计算几何,随机点集之三角剖分的德劳内(Delaunay)算法的源代码

一、三角剖分Delaunay算法简介 点集的三角剖分&#xff08;Triangulation&#xff09;&#xff0c;对数值分析&#xff08;比如有限元分析&#xff09;以及图形学来说&#xff0c;都是极为重要的一项预处理技术。尤其是Delaunay三角剖分&#xff0c;由于其独特性&#xff0c;关…

03 Redis之命令(基本命令+Key命令+String型Value命令与应用场景)

Redis 根据命令所操作对象的不同&#xff0c;可以分为三大类&#xff1a;对 Redis 进行基础性操作的命令&#xff0c;对 Key 的操作命令&#xff0c;对 Value 的操作命令。 3.1 Redis 基本命令 一些可选项对大小写敏感, 所以应尽量将redis的所有命令大写输入 首先通过 redis-…

Nodejs前端学习Day3_准备工作

妈的&#xff0c;这几天真tm冷&#xff0c;前天上午还下了一整天的雪&#xff0c;大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程

文章目录 GPU、NVIDIA Graphics Drivers、CUDA、CUDA Toolkit和cuDNN的关系使用情形判断仅仅使用PyTorch使用torch的第三方子模块 安装NVIDIA Graphics Drivers&#xff08;可跳过&#xff09;前言Linux法一&#xff1a;图形化界面安装&#xff08;推荐&#xff09;法二&#x…

用友U8接口-部署和简要说明(1)

概括 本专栏文章目的说明对目前用友U8ERP接口介绍对底层接口二次封装的介绍 说明 过去发布过介绍U8接口文章简介&#xff0c;参考以下链接。 U8接口开发方式 本专栏文章与下面的HTTP接口相辅相成&#xff0c;主要是写给正在使用&#xff0c;或未来使用本套接口的开发人员&am…

PhpStorm调试docker容器中的php项目

背景 已经通过docker容器启动了一个web服务&#xff0c;并在宿主机可以访问http://localhost:8080访问网页。 现在想使用phpstorm打断点调试代码。 方法 1. 容器内安装xdebug 进入容器 docker exec -it <container-name> bash为php安装xdebug拓展 apt install php8…

市场复盘总结 20240122

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 6/39 15.3% 二进三&#xff1a; 进级率低 0% 最常用的二种方法&#xff1a; 方法…

数据湖技术之发展现状篇

一. 大数据处理架构&#xff1a; 大数据处理架构的发展过程具体可以分为三个主要阶段&#xff1a;批处理架构、混合处理架构&#xff08;Lambda、Kappa架构&#xff09;、湖仓一体。首先是随着Hadoop生态相关技术的大量应用&#xff0c;批处理架构应运而生&#xff0c;借助离线…

用C语言实现贪吃蛇游戏!!!

前言 大家好呀&#xff0c;我是Humble&#xff0c;不知不觉在CSND分享自己学过的C语言知识已经有三个多月了&#xff0c;从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容&#xff0c;也希望这些内容可以帮助到各位正在阅读的小伙伴…

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB参考文献 1. 容器与应用之间的关系介绍 MongoDB 的安装有时候并不是那么容易的&#xff0…

Qt项目文件以及对象树

"在哪里走散&#xff0c;你都会找到我~" 前篇&#xff0c;我们仅仅对Qt创建了第一个简单的项目。相比于使用其他IDE创建工程项目&#xff0c;Qt会为自动创建诸如&#xff1a;.pro、.h\.cpp、.iu等文件&#xff0c;这些文件到底是什么&#xff1f;我们在使用Qt时 应该…

c++ QT 信号的个人理解 信号就是独立文件调用的一种“协议”

一. 简介 就我个人来理解&#xff0c;信号槽机制与Windows下消息机制类似&#xff0c;消息机制是基于回调函数&#xff0c;Qt中用信号与槽来代替函数指针&#xff0c;使程序更安全简洁。 信号和槽机制是 Qt 的核心机制&#xff0c;可以让编程人员将互不相关的对象绑定在一起&a…

IntelliJ IDE 插件开发 | (五)VFS 与编辑器

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

[GYCTF2020]Ezsqli1

打开环境&#xff0c;下面有个提交表单 提交1&#xff0c;2有正确的查询结果&#xff0c;3以后都显示Error Occured When Fetch Result. 题目是sql&#xff0c;应该考察的是sql注入 简单fuzz一下 发现information_schema被过滤了&#xff0c;猜测是盲注了。 测试发现只要有东…

Qt : Style Sheet

When a style sheet is active, the QStyle returned by QWidget::style() is a wrapper “style sheet” style, not the platform-specific style. The wrapper style ensures that any active style sheet is respected and otherwise forwards the drawing operations to t…