第九十三天学习记录:C++核心:类和对象Ⅱ(五星重要)

news2024/9/21 0:18:04

对象的初始化和清理

构造函数和析构函数

对象的初始化和清理也是两个非常重要的安全问题
一个对象或者变量没有初始化状态,对其使用后果是未知
同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数,只是他们都是空实现。

1、构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
2、析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

构造函数语法:类名(){}

1、构造函数,没有返回值也不写void
2、函数名称与类名相同
3、构造函数可以有参数,因此可以发生重载
4、程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次

构造函数语法:~类名(){}

1、析构函数,没有返回值也不写void
2、函数名称与类名相同,在名称前加上符号~
3、析构函数不可以有参数,因此不可以发生重载
4、程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次

person.h

#pragma once
#include<iostream>
using namespace std;
class Person
{
public:
	//  1、构造函数,没有返回值也不写void
	//	2、函数名称与类名相同
	//	3、构造函数可以有参数,因此可以发生重载
	//	4、程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
	Person();
	//  1、析构函数,没有返回值也不写void
	//	2、函数名称与类名相同,在名称前加上符号~
	//	3、析构函数不可以有参数,因此不可以发生重载
	//	4、程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
	~Person();
	int m_num=0;
	void setnum(int num);
};

main.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "person.h"

void test01()
{
	Person p1;//在栈上的数据,test01执行完毕后,释放这个对象
	p1.setnum(1);
}

int main()
{
	Person p2;
	p2.setnum(2);
	test01();
	system("pause");
	return 0;
}

person.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "person.h"

Person::Person()
{
	cout << "Person构造函数的调用" << m_num << endl;
}

Person::~Person()
{
	cout << "Person析构函数的调用" << m_num << endl;
}

void Person::setnum(int num)
{
	m_num = num;
}

在这里插入图片描述

构造函数的分类及调用

两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐式转换法

#define _CRT_SECURE_NO_WARNINGS 1

#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;
		age = p.age;
		cout << "Person的拷贝数构造函数调用" << endl;
	}
	~Person()
	{
		cout << "Person的析构函数调用" << endl;
	}

	int age;
};

void test01()
{
	//1、括号法
	//Person p1;//默认构造函数调用
	//Person p2(10);//有参构造函数
	//Person p3(p2);
	//注意事项
	//调用默认构造函数时,不要加()
	//因为编译器会认为是一个函数的声明,不会认为在创建对象
	//cout << "p2的年龄为:" << p2.age << endl;
	//cout << "p3的年龄为:" << p3.age << endl;
	//2、显示法
	//Person p1;//默认构造函数调用
	//Person p2 = Person(10);//有参构造函数
	//Person p3 = Person(p2);//拷贝构造函数
	//注意事项
	//不要利用拷贝构造函数,初始化匿名对象

	//Person(10);//匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象
	//3、隐式转换法
	Person p4 = 10;//相当于写了 Person p4 = Person(10);//有参构造函数
	Person p5 = p4;
}

int main()
{
	test01();
	return 0;
}

拷贝构造函数的调用时机

C++中拷贝构造函数调用时机通常有三种情况
1、使用一个已经创建完毕的对象来初始化一个新对象
2、值传递的方式给函数传值
3、以值方式返回局部对象

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;

class  Person
{
public:
	Person()
	{
		cout << "Person的无参数构造函数调用" << endl;//无参构造函数(默认构造函数)

	}
	Person(int age)
	{
		m_Age = age;
		cout << "Person的带参数构造函数调用" << endl;//有参构造函数
	}
	//拷贝构造函数
	Person(const Person &p)
	{
		m_Age = p.m_Age;
		cout << "Person的拷贝数构造函数调用" << endl;
	}
	~Person()
	{
		cout << "Person的析构函数调用" << endl;
	}

	int m_Age;
};

//1、使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{
	Person p1(20);
	Person p2(p1);
}

//2、值传递的方式给函数传值
void doWork(Person p)
{

}

void test02()
{
	Person p;
	doWork(p);
}

//3、以值方式返回局部对象
Person doWork2()
{
	Person p1;
	return p1;
}

void test03()
{
	Person p = doWork2();
}

int main()
{
	//test01();
	//test02();
	test03();
	system("pause");
	return 0;
}

自行探索:☆

1、当类中有任意一个构造函数时,编译器就不会在添加默认构造函数了。
2、当类中程序员自己写了一个拷贝构造函数后,若这个拷贝函数中并没有将所有成员变量的赋值给另一个需要拷贝的类,那么在调用值传递的时候,这些常量的值将不会被拷贝过去。

构造函数的调用规则

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

构造函数调用规则如下:
1、如果用户定义有参构造函数,c++不再提供默认无参构造,但是会提供默认拷贝构造
2、如果用户定义拷贝构造函数,c++不会再提供其他构造函数

#include<iostream>
using namespace std;

class  Person
{
public:
	Person()
	{
		cout << "Person的无参数构造函数调用" << endl;//无参构造函数(默认构造函数)
	}
	Person(int age)
	{
		m_Age = age;
		cout << "Person的带参数构造函数调用" << endl;//有参构造函数
	}
	//Person(const Person &p)//*(Person* const p)
	//{
	//	m_Age = p.m_Age;
	//	cout << "Person的拷贝数构造函数调用" << endl;//拷贝构造函数
	//}
	~Person()
	{
		cout << "Person的析构函数调用" << endl;
	}
	int m_Age;
};

void test01()
{
	Person p;
	p.m_Age = 18;
	Person p2(p);
	cout << "p2的年龄为:" << p2.m_Age << endl;
}

int main()
{
	test01();
	system("pause");
	return 0;
}
#include<iostream>
using namespace std;

class  Person
{
public:
	//Person()
	//{
	//	cout << "Person的无参数构造函数调用" << endl;//无参构造函数(默认构造函数)
	//}
	Person(int age)
	{
		m_Age = age;
		cout << "Person的带参数构造函数调用" << endl;//有参构造函数
	}
	//Person(const Person &p)//*(Person* const p)
	//{
	//	m_Age = p.m_Age;
	//	cout << "Person的拷贝数构造函数调用" << endl;//拷贝构造函数
	//}
	~Person()
	{
		cout << "Person的析构函数调用" << endl;
	}
	int m_Age;
};

//void test01()
//{
//	Person p;//报错
//	p.m_Age = 18;
//	Person p2(p);
//	cout << "p2的年龄为:" << p2.m_Age << endl;
//}

void test02()
{
	Person p(28);
	Person p2(p);
	cout << "p2的年龄为:" << p2.m_Age << endl;
}

int main()
{
	//test01();
	test02();
	system("pause");
	return 0;
}

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

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

相关文章

搜索封装+crud+重点细节优化

新建GSearchQuery.vue <template> <el-row :span"24><el-input type"text" v-model"query"></el-input><slot></slot> </el-row> </template>data() {return{query: }}index.vue 引入组件 <GSe…

每周学点数学 1:数学建模计划篇

用GPT3.5生成了一段数学建模学习的计划&#xff0c;我准备在视觉学习的同时&#xff0c;穿插一些数学理论方面的学习&#xff0c;以下是近三个月的计划。 7月2日-7月8日&#xff1a;了解数学建模的基本概念和方法&#xff0c;阅读相关教材和论文&#xff0c;了解数学建模的应…

【如何用大语言模型快速深度学习系列】开篇+文本匹配系列

开篇 很久没有更新啦&#xff01;这个系列其实是自己的一个学习笔记啦&#xff01;这个系列的特色就是我们不再通过看视频的方式入门深度学习。 开篇的时候&#xff08;2023.07.01&#xff09;&#xff0c;我想的是围绕自然语言处理的一些基础方法&#xff08;代码方面&#…

带你用Python制作一个经典小游戏:扫雷

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 游戏界面尺寸 方块尺寸 雷的数量 游戏状态 最后&#xff0c;我们定义一个函数run()&#xff…

软件项目成本的计算

在《架构思维的六要素》中&#xff0c;列出的第一个要素就是成本&#xff0c;成本对项目设计和决策起着至关重要的作用。今天咱们就来看看直接成本、间接成本和总成本的关系。 直接成本 工作于服务的开发者工作于系统测试的测试者设计数据库的DBA设计界面和致力于优化用户体验的…

ROS学习篇之远程控制(七)-局域网内的控制

文章目录 一.pc与pc端二.手机与pc端&#xff08;1&#xff09;pc端&#xff1a;**步骤1&#xff1a;** 运行 roscore**步骤2&#xff1a;** 新开一个终端运行&#xff0c;运行 rosrun turtlesim turtlesim_node **步骤3&#xff1a;** 新建一个终端查看ip&#xff0c;运行ifcon…

基于matlab根据特征进行全景图像拼接(附源码)

一、前言 此示例演示如何使用基于特征的图像配准技术自动创建全景图。 特征检测和匹配是许多计算机视觉应用&#xff08;如图像配准、跟踪和对象检测&#xff09;中使用的强大技术。在此示例中&#xff0c;基于特征的技术用于自动拼接一组图像。图像拼接过程是基于特征的图像…

火车头采集:高效数据采集工具的介绍

火车头采集是一款基于Python语言开发的网络爬虫工具&#xff0c;用于快速高效地从互联网上采集数据并存储到本地或远程数据库。它简单易用且功能强大&#xff0c;在各行各业广泛应用。 1、设置chatgpt自定义key 添加网站 通过关键词批量生成原创文章 设置发布网站 发布成功 相…

Python GUI编程利器:Tkinker中的文本输入框和下拉菜单(4)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 实现下面效果&#xff1a; 文本输入框(Entry类) 文本输入框&#xff0c;顾名思义&#xff0c;就是实现文本输入功能…

dnsServer搭建

一、dokcer安装 #下载文件&#xff1a;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml #另存到/root/docker-compose.yml cd /root docker-compose -f docker-compose.yml up -d #启动成功后&#xff0c;浏览器输入&#xff1a;http://192…

Airtest:Windows桌面应用自动化测试【AirtestIDE功能】

AirtestIDE功能 基础功能一、设备窗二、Airtest辅助窗三、Poco辅助窗3.1UI树常见问题&#xff1a;3.1.1为什么我选择了Poco模式后&#xff0c;没有成功刷出UI树3.1.2为什么接入了SDK、使用了原生App依然看不到UI树3.1.3UI树在一段时间后没有正确刷新 四、脚本编辑窗五、Log查看…

蓝牙HID与Android的通信--多点触摸问题

通过蓝牙HID上传鼠标&#xff0c;键盘&#xff0c;按键的事件基本已经比较成熟。并且功能比较好实现&#xff0c;基本参照网络上的配置都可以弄出来。但多点触摸功能却怎么弄都没有满意的结果。搜罗了网上的很多报告描述符的描写&#xff0c;试验了一段时间&#xff0c;竟然没有…

OpenCV:深入Feature2D组件——角点检测

角点检测 1 Harris角点检测1.1 兴趣点与角点1.2 角点检测1.3 harris角点检测1.4 实现harris角点检测&#xff1a;cornerHarris()函数1.5 综合案例&#xff1a;harris角点检测与测绘 2. Shi—Tomasi角点检测2.1Shi—Tomasi角点检测概述2.2 确定图像强角点&#xff1a;goodFeatur…

硬件基本常识杂记1

文章目录 电感&#xff08;RL电路&#xff09;&#xff0c;电容&#xff08;RC电路&#xff09;&#xff0c;(LRC电路)谐振&#xff08;串联、并联&#xff09;滤波器&#xff08;高通RC、低通RC、高通RL、低通RL、带通、Π型&#xff09;积分电路、微分电路截至频率w信号传输、…

Docker迁移与备份

容器保存为镜像 语法: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 为nginx创建镜像: docker commit -a "leq" -m "nginx的镜像" 10053cd47ebf nginx:v1.0 -a 提交的镜像作者 -m 提交时的说明文字 镜像备份 语法: docker save…

深入理解C语言对文件的包装与缓冲区

内存级文件操作的运用 1.模拟实现文件分装2. 深入理解缓冲区的概念 1.模拟实现文件分装 【目标】 以最简单的方式&#xff0c;理解FILE结构体的原理。 头文件&#xff1a;mystdio.h&#xff08;定义了MY_FILE结构体&#xff0c;声明fopen&#xff0c;fwrite&#xff0c;fclos…

『手撕 Mybatis 源码』10 - 一级缓存

一级缓存 概述 一级缓存是 SqlSession 级别的缓存。在操作数据库时需要构造 SqlSession 对象&#xff0c;在对象中有一个数据结构&#xff08;HashMap&#xff09;用于存储缓存数据。不同的 SqlSession 之间的缓存数据区域&#xff08;HashMap&#xff09;是互相不影响的二级缓…

hive基于新浪微博的日志数据分析——项目及源码

有需要本项目的全套资源资源以及部署服务可以私信博主&#xff01;&#xff01;&#xff01; 本系统旨在对新浪微博日志进行大数据分析&#xff0c;探究用户行为、内容传播、移动设备等多个方面的特征和趋势&#xff0c;为企业和个人的营销策略、产品设计、用户服务等提供有益的…

PN结、二极管、三极管、三极管放大电路、上拉电路/下拉电路

1、N型参杂 与 P型参杂 B站 视频地址 &#xff1a;https://www.bilibili.com/video/BV1fB4y147Gn 1&#xff09;N型参杂 &#xff08;N型半导体&#xff09; &#xff1a; 4价硅 参杂 5价麟&#xff0c;多一个自由负电子&#xff08;带负电&#xff09; 2&#xff09;P型参杂…

Linux性能学习(4.2):网络_为什么MTU是1500

文章目录 1 基本概念2 为什么MTU是15003 有效载荷最大是1500吗4 Linux下如何修改MTU 参考资料&#xff1a; 1. RFC894 2. 什么是MTU&#xff08;Maximum Transmission Unit&#xff09;&#xff1f; 1 基本概念 Maximum Transmission Unit&#xff0c;缩写MTU&#xff0c;即…