首页 > 其他分享 >全面分析构造函数(1)

全面分析构造函数(1)

时间:2024-07-15 19:54:53浏览次数:12  
标签:分析 int 构造 num 全面 拷贝 other 构造函数

什么是构造函数        

        构造函数是在创建类对象时,由系统自动调用,初始化新对象的函数,给其中的成员变量赋值。构造函数没有返回值,名字与类名相同,有参数,所以可以进行函数重载,构造函数大致可以分为一下几类:

  1. 无参构造:没有参数的构造函数,也是默认构造函数
  2. 有参构造:含有参数的构造函数
  3. 拷贝构造:用一个已有对象来初始化一个新对象
  4. 移动构造:把已有对象的资源给新对象,旧对象不再占有资源

        拷贝构造又可以分为深拷贝和浅拷贝。        

        一般来说,我们定义一个类,系统通常会提供三个函数,即默认构造、拷贝构造和赋值运算符重载,当我们实现了其中的一个构造函数后,系统将不再提供默认构造函数。

无参构造

        当我们没有自己定义任何构造函数时,系统会提供给这个类一个默认构造函数,但是这个构造函数内部实际上什么都没做,我们一般可以用午餐构造来初始化一个默认的对象,比如说我们定义了一个时间类,我们可以在无参构造中将它的各个属性(时,分,秒)赋值为0,避免我们直接使用时输出的随机值,不符合实际要求。

有参构造

        当我们只实现了有参构造而没有实现无参构造时,系统将不再提供默认的无参构造,有参构造,通常用来将传入的参数赋值给对应的属性(注意是赋值,不是初始化,初始化参数列表是给属性初始化),我们在创建对象的时候,直接在对象名后面用括号给出对应参数的值即可。

class m_time {
public:
	int h, m, s;
	m_time(int h, int m, int s) {
		this->h = h;
		this->m = m;
		this->s = s;
	}
};

int main() {
	//m_time a;//报错,没有默认构造
	m_time a(1,2,3);
	return 0;
}

 拷贝构造

        拷贝构造是用一个已经存在的对象初始化一个新对象,二者属性中的值相等,拷贝构造函数的参数必须是引用,这是因为我们在调用拷贝构造时,需要给参数对象传参,这时如果参数不是引用,则需要先调用拷贝构造给参数初始化,但这个函数本身就是拷贝构造函数,所以会导致无限递归下去,最终栈空间溢出,爆栈。

        拷贝构造又可以细分为深拷贝浅拷贝,这个区别主要体现在属性中有在堆区空间申请内存的类,深拷贝是重新申请一块同样大小的空间,并且将其中的值复制到新对象的堆区空间,而,浅拷贝只做简单的值复制,导致两个指针指向同一块堆区空间,这样会有两个问题,第一是,在对其中一个对象进行操作时,会影响到另一个对象的属性;第二是在最终释放时,程序会因为重复释放同一块空间导致崩溃。

class A {
public:
	int num;
	int* p = nullptr;
	A(int num) {
		this->num = num;
		p = new int[3];
	}
	/*A(const A& other) {
		this->num = other.num;
		this->p = other.p;
	}*/
	//上面是浅拷贝,对指针也只是简单的赋值

	A(const A& other) {
		this->num = other.num;
		this->p = new int[3];
		for (int i = 0; i < 3; i++) {
			this->p[i] = other.p[i];
		}
	}
	//深拷贝,单独再开辟一块空间,将其中的值也复制过去
	~A() { if (p) delete[] p; }
	//析构函数,清理资源,防止内存泄漏
};

int main() {
	A a(2);
	A b(a);
	cout << b.num << endl;
    //输出 2
	return 0;
}

移动构造

        移动构造是一个新的概念,与右值引用相关(右值引用的概念可以看http://t.csdnimg.cn/mjQOp),主要是可以用来捕获将亡值的资源(一般是函数返回值),将其分配给新对象,避免接收返回值时,再次调用拷贝构造,消耗系统资源,通俗来讲,移动构造的意思就是:“我的东西不要了,给你”。

#include<iostream>
using namespace std;

class A {
public:
	int num;
	int* p = nullptr;
	A(int num) {
		this->num = num;
		p = new int[3];
	}
	//左值引用,拷贝构造
	A(A& other) {
		this->num = other.num;
		this->p = new int[3];
		for (int i = 0; i < 3; i++) {
			this->p[i] = other.p[i];
		}
		cout << "拷贝构造" << endl;
	}
	//右值引用,移动构造
	A(A&& other) {
		this->num = other.num;
		this->p = other.p;
		other.p = nullptr;
		cout << "移动构造" << endl;
	}

	~A() { if (p) delete[] p; }
	//析构函数,清理资源,防止内存泄漏
};

A test01() {
	A a(2);
	return a;
}

int main() {
	A b(test01());
	cout << b.num << endl;
	return 0;
}

输出结果为:

        关于构造函数的其他内容,比如初始化参数列表还有属性中有其他类对象的构造的过程,在之后的文章还会继续分享给大家。

标签:分析,int,构造,num,全面,拷贝,other,构造函数
From: https://blog.csdn.net/weixin_58234579/article/details/140428781

相关文章

  • 博客园被百度搜索降权一事的来龙去脉分析 —— 百度减少收录cnblogs博文
    相关事情:蜘蛛的依旧疯狂与园子的新畅想:尝试放出被屏蔽的百度蜘蛛网段再次尝试放出被屏蔽的百度蜘蛛网段面对百度的无期徒刑,幸好还有微软的必应百度搜索引擎是国内搜索引擎的一哥,平时素来霸道,到时也是对谁都霸道的那种。cnblogs虽然是技术博客中的顶流,但是由于没有很好的......
  • 如何使用格点数据分析中国霜冻灾害变化技术应用
    霜冻是一种短历时的农业气象灾害,它是由于日最低气温下降,使植物茎、叶处温度下降到0℃以下,导致正在生长的植物受到冻伤的现象。霜冻出现的早晚会对农作物产量产生显著影响。单站的数据很难在区域范围应用,本课将展示直接利用格点数据进行霜冻灾害分析的主要步骤。白老师,长期从事......
  • 全面掌握 Vue 路由:从基础到进阶
    标题:全面掌握Vue路由:从基础到进阶在现代前端开发中,单页面应用(SPA)已经成为主流,而路由作为SPA的核心功能之一,起着至关重要的作用。Vue.js作为一个流行的前端框架,其官方路由库vue-router提供了强大且灵活的路由管理功能。本文将深入探讨Vue路由的使用,包括基础配置、动态路......
  • kotlin标准函数let apply等分析
    在kotlin中,在standard.kt中定义了一些标准的方法,这里对这些方法进行挨个的阅读TODO方法这方法比较简单,就是直接抛出一个异常,这里有一个inline关键字,定义的是一个内联方法,内联方法的意思是调用时整个方法的代码一起替换过去,下面是TODO方法的源码publicinlinefunTODO(......
  • MoneyPrinterPlus全面支持本地Ollama大模型
    MoneyPrinterPlus现在支持批量混剪,一键AI生成视频,一键批量发布短视频这些功能了。之前支持的大模型是常用的云厂商,比如OpenAI,Azure,Kimi,Qianfan,Baichuan,TongyiQwen,DeepSeek这些。支持云厂商的原因是现在大模型使用基本都很便宜,并且大厂的稳定性,性能都比本地搭建要好很多......
  • 学习总结:数据分析方法(侧重于解决实际问题)
    目录一、战略与组织SWOT分析PEST分析BSC平衡计分卡波特五力模型BCG矩阵GE矩阵二、质量与生产TPMTQM六西格玛OPTPDCAAUDIT法(汽车行业)三、营销服务STP分析4Ps普销组合SPIN销售法安索夫矩阵推销方格理论哈夫模型四、财务管理z-SCORE模型ABC成本法杜邦分......
  • 全球石英振荡器行业现状、重点企业分析及项目可行性研究报告(2024-2030)
    2024年7月15日环洋市场咨询机构出版了一份详细的、综合性的调研分析报告【全球石英振荡器行业总体规模、主要厂商及IPO上市调研报告,2024-2030】。本报告研究全球石英振荡器总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析石英振荡器市场主要驱动......
  • 化妆品OEM和ODM行业发展前景分析及市场趋势研究报告
    2024年7月15日GlobalInfoResearc调研机构发布了《全球化妆品OEM和ODM行业总体规模、主要厂商及IPO上市调研报告,2024-2030》。本报告研究全球化妆品OEM和ODM总体规模,主要地区规模,主要企业规模和份额,主要产品分类规模,下游主要应用规模等。统计维度包括收入和市场份额等。不仅......
  • 聚类分析 数模打卡
    聚类分析1.聚类任务无监督学习:通过对无标记训练样本的学习来揭示数据的内在性质及规律。聚类:把数据集中的样本划分为若干互斥子集,每个子集称一个簇cluster。两个基本问题:性能度量与距离计算。2.性能度量vslidityindex.作为判断和优化目标。外部指标:将聚类结果与某......
  • 基于小波分析的糖尿病视网膜病变检测(Python)
    fromscipyimportmiscfromPILimportImagefromskimageimportexposurefromsklearnimportsvmimportscipyfrommathimportsqrt,pifromnumpyimportexpfrommatplotlibimportpyplotaspltimportnumpyasnpimportglobimportmatplotlib.pyplotas......