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

news2024/9/21 18:06:44

构造函数和析构函数

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

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

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

 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/431605.html

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

相关文章

牛客竞赛字符串专题 NC237664 Typewriter(SAM + 树上倍增 + 二分 + 线段树优化dp)

本题主要考察了如何用 SAM 求原串每个前缀对应的能与非后缀匹配的最长后缀&#xff0c;以及如何求 SAM 每个节点 right 集合的 min / max。很有价值的一道串串题。 题意&#xff1a; 你有一台打字机&#xff0c;你需要用它打出一段只由小写字母构成的文本S。 设某个时刻&#…

java数据结构刷题二期

在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵&#xff0c;以及两个正整数 r 和 c &…

考研数据结构--栈和队列

栈和队列 文章目录 栈和队列栈栈的定义&#xff08;特点&#xff09;栈的存储表示栈的基本操作栈的顺序存储方式和基本操作实现顺序栈的定义顺序栈的初始化顺序栈的判空顺序栈的判满顺序栈的进栈顺序栈的出栈取栈顶元素main函数测试 栈的链式存储方式和基本操作实现链栈的定义链…

sentiel安装与整合

(1)方案一:超时处理 设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待(只能缓解,不能从根本上解决) (2)方案二:舱壁模式 限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。(会造成资源浪费) (3)方案三:熔断降…

不坑盒子 + 智能写作(Office、WPS插件)助你高效办公,早点下班回家。

不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理&#xff0c;如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件&#xff0c;这是一个非常好用的插件工具&#xff0c;专门应用在Word文档中&#xff0c;支持Office 2010以上的版本&#xff0c;用户可以…

ntp时间服务器配置,ssh免密登录 rhce(22)

目录 1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务端主机同步时间. 2.配置ssh免密登录&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务端主机同步时间. 安装时间…

(链表专题) 234. 回文链表——【Leetcode每日一题】

234. 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&…

【蓝桥杯】数组中存在K倍区间的子数组个数

文章目录 前言题目分析算法难度实战1、创建算法2、创建测试用例3、运行测试用例4、测试结果 总结 前言 蓝桥杯全国软件和信息技术专业人才大赛由工业和信息化部人才交流中心主办,每年参赛人数超过30000人。蓝桥杯大赛作为国内领先的全国性 IT 学习赛事&#xff0c;持续有力支撑…

Python爬虫自动化从入门到精通第9天(爬虫数据的存储)

爬虫数据的存储 数据存储概述MongDB数据库的概念MongDB的安装使用PyMongo库存储到数据库 数据存储概述 通常&#xff0c;从网页爬取到的数据需要进行分析、处理或格式化&#xff0c;然后进行持久化存储&#xff0c;以备后续使用。数据存储主要有以下两种方式&#xff1a; 1&am…

启动kafka报错ERROR Fatal error during KafkaServer startup. Prepare to shutdown

一、错误 报的错&#xff1a; ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.common.InconsistentBrokerIdException: Configured broker.id 0 doesn’t match stored broker.id Some(1) in meta.properties. If you m…

跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布

禅道插件上新了&#xff0c;OpenAI 禅道集成&#xff0c;可提供神奇海螺聊天、需求润色功能。 神奇海螺 “章鱼哥&#xff0c;你为什么不问问神奇海螺呢&#xff1f;”——海绵宝宝 那么&#xff0c;就让我们问一问神奇 海螺吧&#xff01;禅道上线神奇海螺功能&#xff0c;…

【C++】优先级队列,反向迭代器

文章目录 priority_queue的介绍和使用priority_queue的使用 反向迭代器 priority_queue的介绍和使用 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆&#xff0c;在堆中可以随时插入元素&a…

数据分析之Pandas 基础入门

一、初始Pandas pandas 是数据分析三大件之一&#xff0c;是Python的核心分析库&#xff0c;它提供了快捷、灵活、明确的数据结构&#xff0c;它能够简单、直观、快速的处理各种类型的数据结构。 pandas 支持的数据结构如下&#xff1a; SQL 或Excel 类似的数据有序或无序的…

后端程序员必须学会的编辑器vim

vim编辑器使用小结 1. vim简介 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。VIM是自由软件。Vim普遍被推崇为类Vi编辑器中最好的一个&#xff0c;事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Lin…

MyBatis(十一)、MyBatis查询语句专题

准备工作&#xff1a; 模块名&#xff1a;mybatis-007-select 打包方式&#xff1a;jar 引入依赖&#xff1a;mysql驱动依赖、mybatis依赖、logback依赖、junit依赖。 引入配置文件&#xff1a;jdbc.properties、mybatis-config.xml、logback.xml 创建pojo类&#xff1a;Car 创…

SQL sever数据库----基础增删改查操作与where条件限制

where条件限制方法 在SQL sever中使用where语句&#xff0c;可以对各种操作添加限制条件 基础格式为 ———————— where 逻辑表达式 例如限制条件的查询 select 范围 from 表名 where 逻辑表达式 逻辑表达式就是一个判断 如 a > 5 、a6>9、a>5 and b>5 各种…

k8s部署流水账

久仰大名k8s&#xff0c;业余选手一直望而却步。最近终于初步炮制成功。知道了大概的流程。本篇为部署备忘录。 经过的大环节有&#xff1a;修改树莓派/boot/cmdline.txt甚至/cmd/config.txt里面的集群相关设置&#xff0c;把cgroup驱动enable好。swap关掉。这些都是所有集群内…

比较几种热门Hybrid App前端框架

作为一种既能够在原生应用程序环境中运行&#xff0c;也能够在 Web 浏览器中运行的应用程序&#xff0c;Hybrid App 主要使用 Web 技术进行开发&#xff0c;如 HTML、CSS 和JavaScript&#xff0c;并使用一个中间层将其封装在原生应用程序中。随着技术的持续推进&#xff0c;Hy…

3.3栈和队列的应用

3.3.1括号匹配问题 IDE可视化的编程环境 作为一名程序开发人员&#xff0c;不管你使用哪门语言开发都有很多可以选择的集成开发环境IDE&#xff08;Integrated Development Environment&#xff09;&#xff0c;IDE是提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器…

程序员挣够了钱,到中年失业真的很可怕吗?

借用最近很火的一张图&#xff0c;看看没有工作&#xff0c;你手里的存款够用几年&#xff08;按每年年化3.5%&#xff0c;利息继续放入理财计算&#xff09;&#xff1a; 如果每年花销在10万左右&#xff08;折合每个月8333元&#xff0c;应该是比较富足的&#xff09;&#x…