C++:类和对象2

news2024/12/23 9:43:47

1.类的默认成员函数

默认成员函数就是用户没有显示实现编译器会自动生成的成员函数称为默认成员函数。一个类,我们在不写的情况下编译器会默认生成6个默认成员函数,分别是构造函数,析构函数,拷贝构造函数,拷贝赋值运算符重载和取地址运算符重载。

1.1构造函数

构造函数在C++中是一中特殊的成员函数,需要特别注意的是构造函数虽然名称叫构造,但是它主要任务并不是开空间创建对象而是在创建对象时初始化对象。构造函数具有以下几个关键特点:

1.构造函数的名称必须与类名完全相同(包括大小写)

2.无返回值(包括void)

3.构造函数可以重载

4.如果类中没有定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。

5.无参构造函数、全缺省构造函数、我们不写构造是编译器默认生成的构造函数都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意默认构造函数不只是编译器默认生成的那个构造函数,实际是上无参构造函全缺省构造函数也是默认构造函数。总而言之就是不传参就可以调用的勾走函数就叫默认构造函数。

6.我们不写编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说内置类型成员变量的初始化是不确定的,看编译器。对于自定义类型的成员变量,要求调用这个成员变量都默认构造函数初始化。如果这个成员变量没有默认构造函数,那么就会报错,我们要初始化这个成员变量需要用初始化列表才能解决,初始化列表我们以后会讲解。

微提示:C++把类型分为内置类型和自定义类型。内置类型就是语言提供的原生数据类型,如:int/char/double等,自定义类型就是我们使用class/struct等关键字字节定义的类型。

class date
{
public:
	//无参构造函数
	date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	//带参构造函数
	date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	date d1;
	d1.print();
	return 0;
}

微提示:在上述代码中类date 定义了一个对象d1并自动调用了无参构造函数

class date
{
public:
	//无参构造函数
	date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	//带参构造函数
	date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	date d1();
	d1.print();
	return 0;
}

 

微提示:当我们在使用无参构造函数时,在定义对象时我们不可以在在对象后面加上括号 

class Date
{
public:


	//带参构造函数
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Print();
	return 0;
}

解析:在这个代码中我们使用的是带参数的构造函数但是在编译时编译器报错了,
错误为   “Date”: 没有合适的默认构造函数可用    
这说明了带参数的构造函数不是默认构造函数

class date
{
public:
	//无参构造函数
	date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	//带参构造函数
	date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	date d1;
	d1.print();

	date d2(2024, 7, 24);//调用带参构造函数
	d2.print();
	return 0;
}

微提示:带参构造函数的调用值需要再定义对象的时候同时传参就行了

 由于构造函数可以重载,所以我们可以定义一个全缺省构造函数,如下例:

class date
{
public:
	//无参构造函数
	date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	//带参构造函数
	date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	//全缺省函数
	date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}


	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	date d1;
	d1.print();

	date d2(2024, 7, 24);
	d2.print();

	date d3(2024);
	d3.print();
	return 0;
}

 

 微提示:由于无参构造函数和全缺省构造函数是重载函数,所以两者不能同时出现否者会出现调用歧义,编译器不种地调用哪一个构造函数。

class date
{
public:
	
	//全缺省函数
	date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}


	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	date d3(2024);
	d3.print();
	return 0;
}

 

 微提示:全缺省函数函数如果给了实参就使用实参,否者使用默认参数。我们在定义时值给了实参2024,所以打印的结果就是年是实参,其他参数是默认参数

 2.析构函数

析构函数和构造函数的功能相反,析构函数不是完成堆对象本身的销毁C++规定对象在销毁时会自动调用析构函数完成堆对象中资源的清理释放工作。

析构函数的特点:

1.析构函数的名称由波浪号(~)后跟类名组成

2无参数无返回类型。

析构函数不接受任何类型,也不能被重载,没有任何任何类型,甚至连void都不写

3.每个类都只有一个析构函数。如果尝试为类定义多个析构函数编译器会报错

4.若未显示定义,编译器会自动生成默认的析构函数

5.跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定义类型成员会调用他的析构函数

6.我们显示写的析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类型成员无论什么情况下都会自动调用析构函数

7.如果类中没有申请资源是,析构函数可以不写,直接使用编译器生成的默认析构函数;如果默认生成的析构就可以用也就不需要显示写析构;但是由资源申请时,一定要自己写析构,否者会造成资源泄露。

class Date
{
public:
	int year;
	int month;
	int day;

	//构造函数
	Date(int y, int m, int d)
	{
		y = year;
		m = month;
		d = day;
	}

	//析构函数
	~Date()
	{
		//在这个例子中,析构函数不执行任何操作
		//因为Date类不包含需要手动清理的资源
	}
};

 微提示:在这个代码中我们没有动态的申请空间(如使用malloc等)来开辟空间所以我们可以不写析构函数

3.拷贝构造函数 

如果一个构造函数的第一个参数是自身类型的引用而且任何额外的参数都有默认值,则该构造函数也叫做拷贝构造函数,也就是说拷贝构造是一个特殊的构造函数。

拷贝构造的特点:

  1. 拷贝构造函数是构造函数的一个重载。
  2. 拷贝构造函数的参数第一个参数是类类型对象的引用,使用传值调用编译器直接报错,因为语法逻辑上会引发无穷递归调用。
  3. C++规定自定义类型对象进行拷贝行为必须调用拷贝构造,所以这里自定义类型传值传参和传值返回都会调用拷贝构造完成。
  4. 若为显式定义拷贝构造,编译器会自动生成拷贝构造函数。自动生成的拷贝构造对内置类型成员变量会完成浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用他的拷贝构造。
  5. 传值返回会产生一个临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(引用),没有产生拷贝。但是如果返回对象是一个当前函数局部域的局部对象,函数结束就销毁了

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

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

相关文章

前缀和与差分大总结!!!C++

学了忘忘了学o(╥﹏╥)o 题源acwing 讲解前缀和一维&#xff0c;用于序列二维&#xff0c;用于矩阵 讲解差分什么是差分数组&#xff1f;一维差分数组二维差分数组 题目一&#xff1a;前缀和题目二&#xff1a;子矩阵的和题目三&#xff1a;差分题目四&#xff1a;差分矩阵 讲…

案例分享-国外轻松感UI设计赏析

国外UI设计倾向于采用简洁的布局、清晰的排版和直观的交互方式&#xff0c;减少用户的认知负担&#xff0c;从而营造出轻松的使用体验。这种设计风格让用户能够快速找到所需信息&#xff0c;降低操作难度&#xff0c;提升整体满意度。 在注重美观的同时&#xff0c;更加重视用户…

便携移动工作站,端侧 AI 大模型设备折腾笔记:ROG 幻 X 和 4090 扩展坞

为了本地测试和开发更丝滑&#xff0c;最近入手了一套新设备 ROG 幻 X Z13 和 ROG XG Mobile 4090 扩展坞。 基于这套设备&#xff0c;我搭了一套 Windows x WSL2 x CUDA 的开发环境。分享一下折腾记录&#xff0c;或许对有类似需求的你也有帮助。 写在前面 最近因为各种事情…

【MySQL】索引 【下】{聚簇索引VS非聚簇索引/创建主键索引/全文索引的创建/索引创建原则}

文章目录 1.聚簇索引 VS 非聚簇索引经典问题 2.索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引索引创建原则 1.聚簇索引 VS 非聚簇索引 之前介绍的将所有的数据都放在叶子节点的这种存储引擎对应的就是 InnoDB 默认存储表数据的存储结构。 …

【大模型系列】Video-LaVIT(2024.06)

Paper&#xff1a;https://arxiv.org/abs/2402.03161Github&#xff1a;https://video-lavit.github.io/Title&#xff1a;Video-LaVIT: Unified Video-Language Pre-training with Decoupled Visual-Motional TokenizationAuthor&#xff1a;Yang Jin&#xff0c; 北大&#x…

[Office] Word 特殊字符

0 打开“特殊字符集” 依次选择&#xff1a;Insert -> Symbol -> More Symbol 1 带圈编号 字体Font选择Wingdings

嵌入式Linux:符号链接(软链接)和硬链接

目录 1、符号链接&#xff08;软链接&#xff09; 2、硬链接 3、link()函数 4、symlink()函数 5、readlink()函数 在 Linux 系统中&#xff0c;符号链接&#xff08;软链接&#xff09;和硬链接是两种创建文件链接的方法。理解它们的区别和使用场景对于文件系统的管理非常…

错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配

这个问题实际上网上都有解法&#xff0c;但是可能没有那么的清楚&#xff0c;大家在各种问&#xff0c;我既然搞定了&#xff0c;就分享给大家吧网上解法&#xff1a; 开发调试需要另外创建开发证书和描述文件&#xff0c;描述文件同时绑定开发设备解读&#xff1a; 实际上这句…

举例详细学习和分析后端业务逻辑代码开发思路

在此之前&#xff0c;先来补充一下上一篇文章的一点内容&#xff1a;上一篇文章点击此处详看 对于画线的这句话&#xff0c;来详细解释一下吧&#xff01; 这里面说&#xff0c;对于service服务层&#xff0c;如果我们所需要实现的业务比较简单的话可以直接在...service接口里面…

Spring事件监听的核心机制及其原理

Spring事件监听 Spring的事件监听机制主要由三大核心部分组成即事件&#xff0c;监听器和播放器三部分组成。 事件的发布是通过spring当中的pulishEvent方法实现。事件监听实现是通过监听器监听了对应事件的监听器来实现的。 事件监听的作用&#xff1a;为系统业务之间进行一…

一种可以灵活、高速测试半导体测试中使用的老化板的系统

本文介绍了一种可以灵活、高速测试半导体测试中使用的老化板的系统。 定义&#xff1a;Burn-in Board Testing System是一种通过模拟极端使用条件&#xff08;如高温、高压、高湿等&#xff09;来加速半导体器件老化&#xff0c;并检测其潜在失效的测试系统。目的&#xff1a; …

如何使用 Puppeteer 绕过 Akamai

摘要&#xff1a; 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时&#xff0c;如何运用Puppeteer这一强大的Node.js库&#xff0c;通过模拟真实用户行为、动态请求处理等策略&#xff0c;高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…

红酒标签设计:艺术与品味的结合

在红酒的世界里&#xff0c;每一瓶酒都如同一位优雅的舞者&#xff0c;在酒柜的舞台上静静诉说着自己的故事。而红酒的标签&#xff0c;则是这位舞者身上较华丽的舞裙&#xff0c;它不仅是红酒的身份证明&#xff0c;更是艺术与品味的很好结合。今天&#xff0c;我们就来聊聊红…

计网 - 传统的类网络划分 vs 无类别域间路由CIDR

文章目录 A、B、C 类网络的基本概念和历史背景A 类网络B 类网络C 类网络实际应用场景 CIDR&#xff08;无类别域间路由&#xff09;基本概念CIDR 的表示方法计算 CIDR 网络段的步骤步骤 1&#xff1a;确定网络掩码步骤 2&#xff1a;计算网络地址步骤 3&#xff1a;计算广播地址…

二刷代码随想录训练营Day 11| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、总结

1.逆波兰表达式 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 代码&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st;for(int i 0; i < tokens.size(); i){if(tokens[i] "" || tokens[i…

横看成岭侧成峰,山的叫法何其多。丘 陵 峰 岭 峦 岑 峭 嶂 岳 屺 岵 峡 岬 冈 崮 麓 顶 梁 包 坡 尖

文章目录 引言顶、梁、包、坡、尖山脚叫麓较低而平的山脊叫冈(岗)四周陡峭顶上较平的山叫崮(g)两山之间,有水为峡两山之间,无水为岬(jiǎ)没有草木的山叫屺(qǐ)多草木的山叫岵(h)高而险的山叫嶂高而大的山叫岳高而陡的山叫峭(qio)小而高的山叫岑小而尖的山叫峦高…

在亚马逊云科技AWS上开发大模型应用服务并设计提示词工程

项目简介&#xff1a; 接下来&#xff0c;小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何利用亚…

昇思25天学习打卡营第6天|基础知识-函数式自动微分

目录 环境 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 学习打卡时间 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08…

【C++红黑树应用】模拟实现STL中的map与set

目录 &#x1f680; 前言一&#xff1a; &#x1f525; 红黑树的修改二&#xff1a; &#x1f525; 红黑树的迭代器 三&#xff1a; &#x1f525; perator() 与 operator--() 四&#xff1a; &#x1f525; 红黑树相关接口的改造✨ 4.1 Find 函数的改造✨ 4.2 Insert 函数的改…

推荐珍藏已久的 3 款优质电脑软件,每一款都值得拥有

Advanced Find and Replace Advanced Find and Replace是一款功能强大的文本查找和替换工具&#xff0c;能够高效地在多个文档中进行复杂的内容操作。它支持通配符和正则表达式&#xff0c;使得用户可以精确地定位和替换特定的文本内容。该软件不仅适用于普通文本文件&#xff…