C++(类和对象—对象特性)

news2024/11/30 8:43:12

对象的初始化和清理

生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全。

C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置。

1.构造函数和析构函数

对象的初始化和清理也是两个非常重要的安全问题
一个对象或者变量没有初始状态,对其使用后果是未知
同样的使用完一个对象或变量,没有及时清理,也会造成—定的安全问题
C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。

作用:

构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。

析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。 

构造函数语法:类名(){}
1.构造函数,没有返回值也不写void

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

 析构函数语法:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号~

3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次

#include<iostream>
using namespace std;

//对象的初始化和清理

class person {
public:
	//1.构造函数进行初始化操作
	person() {
		cout << "person构造函数的调用" << endl;
	}
	//2.析构函数进行清理操作
	~person() {
		cout << "person析构函数的调用" << endl;
	}
};

void test01() {
	person p;
}

int main() {
	test01();//构造函数和析构函数会自动调用
}

2.函数的分类以及调用

两种分类方式:
按参数分为:有参构造和无参构造

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

三种调用方式:
括号法

显示法

隐式转换法

#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;
		cout << "person拷贝构造函数的调用" << endl;
	}
	//析构函数进行清理操作
	~person() {
		cout << "person析构函数的调用" << endl;
	}

	int age;
};

void test01() {
	//括号法 (更推荐)
	person p1;//默认构造函数调用
	person p2(10);//有参构造函数调用
	person p3(p2);//拷贝构造函数调用
	cout << " p2的年龄是 " << p2.age << endl;
	cout << " p3的年龄是 " << p3.age << endl;
	
	//显示法
	person p4;
	person p5 = person(100);//有参构造函数调用
	person p6 = person(p5);//拷贝构造函数调用
	person(10);//匿名对象特点:当前行执行结束后,系统会立即回收掉匿名对象
	cout << " p5的年龄是 " << p5.age << endl;
	cout << " p6的年龄是 " << p6.age << endl;

	//注意事项1:调用无参构造函数不要加(),编译器会认为 person p1(); 是一个函数声明
	//注意事项2:不要利用拷贝构造函数 初始化匿名对象,编译器会认为 Person (p3) === Person p3;
	
	//隐式转换法
	person p7 = 1000;//相当于写了Person p4 = Person(10);有参构造
	person p8 = p7;//拷贝构造
	cout << " p7的年龄是 " << p7.age << endl;
	cout << " p8的年龄是 " << p8.age << endl;
}

int main() {
	test01();
}
person无参构造函数的调用
person有参构造函数的调用
person拷贝构造函数的调用
 p2的年龄是 10
 p3的年龄是 10
person无参构造函数的调用
person有参构造函数的调用
person拷贝构造函数的调用
person有参构造函数的调用
person析构函数的调用
 p5的年龄是 100
 p6的年龄是 100
person有参构造函数的调用
person拷贝构造函数的调用
 p7的年龄是 1000
 p8的年龄是 1000
person析构函数的调用
person析构函数的调用
person析构函数的调用
person析构函数的调用
person析构函数的调用
person析构函数的调用
person析构函数的调用
person析构函数的调用

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

C++中拷贝构造函数调用时机通常有三种情况
1.使用一个已经创建完毕的对象来初始化一个新对象

2.值传递的方式给函数参数传值
3.以值方式返回局部对象

4.构造函数的调用规则 

默认情况下,c++编译器至少给一个类添加3个函数

1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)

3.默认拷贝构造函数,对属性进行值拷贝


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

如果用户定义拷贝构造函数,C++不会再提供其他构造函数

5.深拷贝和浅拷贝 

深浅拷贝是面试经典问题,也是常见的一个坑
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作

浅拷贝带来的问题是:堆区的内存重复释放。

浅拷贝带来的问题要通过深拷贝来解决。 

6.初始化列表         

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

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

#include<iostream>
using namespace std;

class person {
public:
	//初始化列表方式初始化
	person() :A(1), B(2), C(3){}
	void print() {
		cout << "A= " << A << endl;
		cout << "B= " << B << endl;
		cout << "C= " << C << endl;
	}
private:
	int A;
	int B;
	int C;
};

int main() {
	person p;
	p.print();
}
A= 1
B= 2
C= 3

7.类对象作为类成员

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

 

8.静态成员

9.C++对象模型和this指针

10.this指针概念

11.空指针访问成员函数

12.const修饰成员函数

 

 

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

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

相关文章

ROS理论与实践学习笔记——5 ROS机器人系统仿真之URDF、Gazebo与Rviz综合应用

6.1 机器人运动控制以及里程计信息显示 &#xff08;1&#xff09;ros_control 简介 场景&#xff1a;如何在不同的机器人系统上实现同一套 ROS 程序的部署&#xff1f;例如&#xff0c;在开发阶段&#xff0c;为了提高测试效率&#xff0c;程序通常在仿真平台&#xff08;如 …

vue2 Canvas 多边形区域绘制组件封装

效果预览&#xff1a; CanvasBox组件 <!-- 区域设置canvas --> <template><div class"all" ref"divideBox"><!-- <div><button click"test">清空</button></div> --><img id"img"…

FineReport 标题冻结,冻结表头,冻结行列

先进行重复标题行和重复标题列设置&#xff0c;然后再进行分页冻结设置 1、冻结列 SELECT * FROM S人员花名册选定列 – 右击 – 设置重复标题列 2、冻结行 选定行 – 右击 – 设置重复标题行 3、重复与冻结设置 模板 – 重复与冻结设置 冻结重复标题有分页冻结和填报…

Leecode刷题之路第20天之有效的括号

题目出处 20-有效的括号-题目出处 题目描述 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 1.左括号必须用相同类型的右括号闭合…

GraphRAG:知识图谱+RAG技术

由于RAG的一些缺陷&#xff0c;最近工作中用到了GraphRAG&#xff0c;可以简单理解为知识图谱RAG工作&#xff0c;在进行QFS与深度推理上表现良好。老板希望&#xff0c;在类似于库存管理、预测上面&#xff0c;可以结合更多的上下文信息和逻辑关系&#xff0c;进行推理和结果的…

一文带你了解,2024年世界职业院校技能大赛该如何备赛

2024年世界职业院校技能大赛&#xff08;以下简称“大赛”&#xff09;即将拉开帷幕&#xff0c;这不仅是一次展示职业院校学生专业技能的舞台&#xff0c;更是促进国际职业教育交流与合作的重要契机。为了确保参赛队伍能在比赛中取得优异成绩&#xff0c;以下是一些具体建议&a…

【第2章 开始学习C++】函数

文章目录 导语使用有返回值的函数函数变体用户定义的函数用户定义的有返回值的函数 导语 函数用于创建 C 程序的模块&#xff0c; 对 C 的 OOP 定义至关重要。 C 函数分两种&#xff1a; 有返回值的和没有返回值的。 使用有返回值的函数 有返回值的函数将生成一个值&#x…

MySQL SELECT 查询(二):复杂查询的实现

MySQL SELECT 查询&#xff08;二&#xff09;&#xff1a;复杂查询的实现 文章目录 MySQL SELECT 查询&#xff08;二&#xff09;&#xff1a;复杂查询的实现1. 多表查询1.1 常见错误&#xff1a;笛卡尔积与属性归属1.2 连接条件与规范1.3 连接类型1.4 SQL99 连接特性 2. SQL…

C++红黑树(简单易懂)

C红黑树 红黑树红黑树的概念 红黑树节点的定义红黑树的插入颜色变化红黑树的插入拷贝构造红黑树的验证全部代码实现红黑树与AVL树的比较红黑树的应用 &#x1f30f;个人博客主页&#xff1a;个人主页 红黑树 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…

Java并发 - 线程池

文章目录 总体设计常见线程池FixedThreadPoolCachedThreadPoolSingleThreadPoolThreadPoolExecutor 核心参数工作原理生产者消费者模型创建线程池提交任务任务提交方式任务提交流程executeaddWorker Worker队列线程运行 runWoker获取任务销毁工作线程线程池关闭shutdown/shutdo…

维修数据屏:重塑热力公司运维管理新格局

在热力公司的运维管理中&#xff0c;高效的报修和维修流程是确保系统稳定运行的关键。随着科技的发展&#xff0c;维修数据屏的出现为热力公司的运维工作带来了重大变革。 一、传统热力运维面临的挑战 过去&#xff0c;热力公司在报修和维修方面存在诸多问题&#xff0c;给运维…

基于Java的超市管理系统(源码+定制+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

创建包含可导入浏览器信任的SSL自签名证书

问题&#xff1a;现在的三大浏览器&#xff0c;chrome、edge、firefox 一般都默认启用https检查&#xff0c;这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…

哪款宠物空净运行吸毛好、噪音小?希喂、霍尼韦尔、安德迈测评!

作为宠物领域目前最火热的产品&#xff0c;宠物空气净化器的讨论度一直很高。身为铲屎官的我在产品刚出的时候就购入了一台&#xff0c;结果让我非常失望&#xff01; 抛开产品效果不提&#xff0c;它运行起来的声音实在太大了&#xff01;我家猫根本不愿意靠近&#xff0c;每…

定焦镜头可以改变焦距吗?

1、问题背景 焦距是镜头的一个固有光学特性&#xff0c;和镜头设计相关&#xff0c;所谓定焦镜头&#xff0c;焦距肯定是固定不变的。 但有个问题一直有点疑惑&#xff0c;焦距是镜头中心到焦点的距离&#xff0c;当我们拧动镜头调焦的过程&#xff0c;就是为了使得焦点成像在传…

信息安全保障人员认证(CISAW)全攻略

由中国网络安全审查认证和市场监管大数据中心耗时六年&#xff0c;汇聚业界专家、企业翘楚、高校及研究机构学者共同精心打磨而成的针对信息安全保障的不同专业技术方向、应用领域和保障岗位&#xff0c;依循国际标准 ISO/IEC 17024《人员认证机构通用要求》所构建的、多层次的…

LabVIEW提高开发效率技巧----减少UI更新频率

在LabVIEW开发中&#xff0c;图形化用户界面&#xff08;UI&#xff09;的更新频率对程序的响应速度有着显著影响。频繁的UI更新会占用大量资源&#xff0c;导致系统性能下降。本文将详细介绍如何通过减少UI更新频率来提升LabVIEW程序的运行效率&#xff0c;从多个角度进行分析…

TCP/UDP通信协议

TCP通讯时序 下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次挥手。 在这个例子中&#xff0c;首先客户端主动发起连接&#xff08;connet&#xff09;、发送请求&#xff0c;然后服务器端响应请求&#xff0c;然后客户端主动关闭连接。两条竖线表…

多功能校准仪怎么进行计量校准?

多功能校准仪计量校准是计量行业常会进行的一种校准&#xff0c;因为其多功能校准仪的普遍适用性&#xff0c;以及其计量校准技术也是在行业内比较通用&#xff0c;那么具体多功能校准仪计量校准怎么进行呢&#xff1f; 校准方法 一、在多功能校准仪的输出范围内&#xff0c;布…

观察者模式的思考

观察者模式由来 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它的起源可以追溯到20世纪90年代初&#xff0c;由设计模式四人帮&#xff08;Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides&#xff09;在其著作《设计模…