【C++学习】类和对象--对象特性(1)

news2024/12/23 9:06:24

构造函数和析构函数

对象的初始化和清理是两个非常重要的安全问题

        一个对象或变量没有初始状态,对其使用后果是未知的

        使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

 C++利用构造函数和析构函数解决上述问题,这两个函数会被编译器自动调用,完成对象的初始化和清理操作。

对象的初始化和清理是编译器强制要我们做的事情,因此如果我们不提供构造和析构函数,编译器会提供(编译器提供的构造和析构函数是空实现

语法

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

1.没有返回值,也不写void

2.函数名称与类名相同

3.构造函数可以有参数,因此可以发生重载

4.程序在调用对象时候会自动调用构造,无需手动调用,而且只会调用一次 

析构函数:~类名(){}

1.没有返回值,也不写void

2.函数名称与类名相同,在名称前加上符号~

3.构造函数不可以有参数,因此不可以发生重载

4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次 

(感觉这部分内容了解一下就行

C++ 类构造函数 & 析构函数 | 菜鸟教程 (runoob.com)

C++ 拷贝构造函数 | 菜鸟教程 (runoob.com)

构造函数的分类及调用 

按照是否传入参数分类,分为无参构造(默认构造)和有参构造

按照类型               分类,分为普通构造                     和拷贝构造

 拷贝调用时机

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

构造函数调用规则

1.创建一个类,C++编译器会给每个类都添加至少3个函数

默认构造  (空实现

析构函数  (空实现

拷贝构造  (值拷贝

 2.如果我们写了有参构造函数,编译器就不再提供默认构造,但会提供拷贝构造函数。

    如果我们写了拷贝构造函数,编译器就不再提供其他的普通构造函数。

(级别:拷贝>有参>默认)

深拷贝与浅拷贝

浅拷贝:编译器提供的都是浅拷贝。简单的赋值也是浅拷贝

深拷贝:在堆区重新申请空间,进行拷贝操作

malloc  /   new    的东西在堆区,堆区的数据要手动开辟,手动释放

浅拷贝带来的问题

用new把数据创建在堆区,并用指针去接收

int *m_height;
m_height=new int (height);
~person()//析构函数,将堆区元素释放
{
		if (m_height != NULL)
		{
			delete m_hight;
			m_hight = NULL;
		}
}

这里会出现bug!!

浅拷贝带来了问题:堆区操作被重复释放 

 利用深拷贝解决

重新在堆区申请内存,也就是让P1指向一块堆区,P2也指向一块堆区。

自己实现一个拷贝构造函数,解决浅拷贝带来的问题

person(const person &p)
{
		//m_height = p.m_height;   编译器默认构造函数
		m_height=new int(*p.m_height);
}

如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。

初始化列表

C++提供了初始化列表语法,用来初始化属性。

语法:构造函数():属性1(值1),属性2(值2)…{}

传统初始化操作

person(int a, int b, int c)
	{
		m_A = a;
		m_B = b;
		m_C = c;
	}

初始化列表初始化属性

person() :m_A(10), m_B(20), m_C(30)
	{

	}
person(int a,int b,int c) :m_A(a), m_B(b), m_C(c)
	{

	}

类对象作为类的成员

C++类中的成员可以是另一个类的对象,我们称该对象为对象成员。

class A{};
class B
{
	A a;
	
};
#include<iostream>
#include<string>
using namespace std;

class phone
{
public:
	phone(string pname)
	{
		m_pname = pname;
	}
	string m_pname;

};
class person
{
public:
	person(string name, string pname):m_name(name),m_phone(pname){}
	string m_name;
	phone m_phone;
	
};
int main()
{
	person p("张三", "apple");

	system("pause");
	return 0;
}

这种情况下会先构造phone类,才会构造person类

当其他类对象作为本类成员,构造时先构造类对象,再构造自身,析构的顺序与构造的顺序相反。

先构造phone,先析构person

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

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

相关文章

排序 Comparable 和 Comparator 区别所在

在 Java 中&#xff0c;Comparable 和Comparator 都是用来元素排序的&#xff0c;但是本质不用。我们从几点开始分析。 1.字面含义 Comparable 中文翻译是”比较“&#xff0c;以 able 结尾 说明它具有某种能力。 Comparator 中文翻译是”比较器“&#xff0c;以 or 结尾 表明…

【C++ 二十】STL:遍历、查找、排序、拷贝和替换、算术生成、集合算法

STL&#xff1a;遍历、查找、排序、拷贝和替换、算术生成、集合算法 文章目录 STL&#xff1a;遍历、查找、排序、拷贝和替换、算术生成、集合算法前言1 常用遍历算法1.1 for_each1.2 transform 2 常用查找算法2.1 find2.2 find_if2.3 adjacent_find2.4 binary_search2.5 count…

室内人员定位系统源码,采用java语言+UWB定位技术开发

运用UWB定位技术开发的人员定位系统源码 文末获取联系 本套系统运用UWB定位技术开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物品的活动信息。 系统提供位置实时显示、历史轨迹回放、人…

循序渐进,学会用pyecharts绘制瀑布图

循序渐进&#xff0c;学会用pyecharts绘制瀑布图 瀑布图简介 瀑布图(Waterfall Plot)是由麦肯锡顾问公司所独创的图表类型&#xff0c;因为形似瀑布流水而称之为瀑布图。 瀑布图采用绝对值与相对值结合的方式&#xff0c;适用于表达多个特定数值之间的数量变化关系。当用户想…

本地Nacos设置脚本命令启动

一、起因&#xff1a; 每次启动都要找到位置写一遍命令费劲。 1、可设置开机启动 2、可设置脚本自动 二、配置脚本&#xff1a; 1、这是我nacos的位置 用bat命令启动一个cmd命令行&#xff0c;然后在里面执行两天命令。 ①命令一&#xff1a;打开指定路径 ②命令二&#xf…

Java图书借阅管理系统详细设计和实现

基于JavaSpringHtml的图书借阅管理系统详细设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

cmd连接本地mysql数据库和远程服务器mysql数据库

1.在cmd窗口里连接本地的mysql数据库 打开运行窗口&#xff0c;输入cmd&#xff0c;确定 windowsr 或在左下角windows图标处鼠标右键&#xff0c;点击运行按钮打开运行窗口 格式&#xff1a; mysql -u用户名 -p密码 mysql -uroot -p123456 成功进入mysql 2. 在cmd窗口里连接远…

尚硅谷_宋红康_第17章_反射机制

第17章_反射机制 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.ge…

Django使用Celery异步发送邮件

Django使用Celery异步发送邮件 前言邮箱配置Django项目发送邮件配置邮件服务器Django发送邮件模块 Celery概述工作模式安装Celery Celery的基本使用创建config.py配置文件创建Celery实例并加载配置定义任务启动Celery服务提交任务异常 Celery发送邮件创建config.py配置文件创建…

机器学习 day05(多元线性回归,向量化,及向量化高效的原理)

1. 单个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格仅由房子的大小决定&#xff0c;如图&#xff1a; 2. 多个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格由房子的大小&#xff0c;房子有多少个卧室&#xff0c;房子有几层&#xff0c;房子…

2023年,逆势拿到大厂Offer,我怎么做?|原创

关于面试&#xff0c;做一些经验分享。 过年时候默默给自己定下了3个目标。第一个就是2023要换一份喜欢的工作。没想到在4月就提前实现了这个目标。 是一个我很看好的大厂&#xff0c;期待的岗位、看好的方向&#xff0c;薪资涨幅也比较给力。最近这段时间没空发文章&#xff0…

MySql中,join 语句怎么优化?

既然每次从驱动表取数据比较耗时&#xff0c;那我们每次从驱动表取一批数据放到内存中&#xff0c;然后对这一批数据进行匹配操作。这批数据匹配完毕&#xff0c;再从驱动表中取一批数据放到内存中&#xff0c;直到驱动表的数据全都匹配完毕 批量取数据能减少很多IO操作&#…

二十三、高级网络技术及应用——BFD解析

文章目录 前言一、BFD 简介1、概述&#xff1a;2、作用&#xff1a; 二、静态路由调用 BFD1、配置静态 BFD2、配置动态 BFD 三、OSPF联动BFD四、BFD 单臂回声&#xff08;one arm echo&#xff09; 前言 BFD&#xff1a;Bidirectional Forwarding Detection&#xff0c;双向转…

奇舞周刊第490期:WebAssembly 多语言/宿主环境中的使用

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ WebAssembly 多语言/宿主环境中的使用 WebAssembly (WASM) 的一个优势就是能够支持将不同语言编译成 WASM 代码&#xff0c;然后在不同的宿主环境中运行。这样就可以在不同的宿主环…

【WSN定位】基于多通信半径和跳距加权优化的Dvhop定位算法【Matlab代码#15】

文章目录 1. 原始Dvhop定位算法2. 多通信半径3. 加权跳距4. 部分代码展示5. 仿真结果展示6. 资源获取 1. 原始Dvhop定位算法 可参考Dvhop定位算法 2. 多通信半径 设网络通信半径为 R R R&#xff0c;将锚节点与邻居节点间分为 m m m级&#xff0c;网络中各信标节点与其邻居节…

Nuxt3用nginx部署到二级目录

有的时候我们需要把我们写的Nuxt3项目部署到域名的二级目录&#xff0c;例如&#xff1a;https://abc.xx.com/abc/目录下。主要就是用nginx进行配置代理转发来实现的&#xff0c;这样可以实现我们同一个域名下可以部署多个Nuxt3独立的项目&#xff0c;只不过端口不同。使用ngin…

Node【Global全局对象】之【Buffer】

文章目录 &#x1f31f;前言&#x1f31f;Buffer&#x1f31f;Buffer介绍&#x1f31f;Buffer对象&#xff1a;类似于数组&#xff0c;其元素是16进制的两位数。&#x1f31f;什么时候用Buffer&#x1f31f;Buffer的转换&#x1f31f;Buffer使用&#x1f31f;创建Buffer&#x…

uniapp 来电显示悬浮窗插件(支持锁屏来电) Ba-CallerID

简介&#xff08;下载地址&#xff09; Ba-CallerID 是一款来电显示悬浮窗插件插件。 支持显示、隐藏支持锁屏来电显示支持自定义位置显示&#xff08;上、中、下&#xff09;支持拖动&#xff08;这版不支持&#xff0c;需要的话可以加&#xff09;支持申请、判断悬浮窗权限…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在&#xff0c;我们生活节奏加快&#xff0c;信息量也越来越大&#xff0c;有时候想了解新闻却又不想眼睛再去盯着手机屏幕了&#xff0c;这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音&#xff0c;别担心&#xff0c;今天我将向大…

JavaSE注解和反射

注解分类和说明点 注解&#xff1a;可对程序做解释可被其他程序读取 元注解&#xff1a;Target&#xff1a;表明注解的使用范围&#xff0c;Retention&#xff1a;表示要在什么级别保存注解信息&#xff0c;Document&#xff0c;Inherited 自定义注解&#xff1a;interface …