从零开始的C++(四)

上篇链接:http://t.csdnimg.cn/3nyT9

1.拷贝构造函数:

上篇中介绍了析构函数,即在对象销毁时自动调用的函数,常用于含有malloc、fopen等成员变量的对象。然而,在将对象做函数实参进行值传递的时候,可能会因为析构函数引发一些错误,实例如下:

复制代码
class stack
{   
public:
	stack(int n=16)
	{   
		//开辟空间
		if (n == 0)
		{
			_arry = nullptr;
		}
		else
		{
			_arry = (int*)malloc(sizeof(int) * n);
			_size = 0;
			_capacity = n;
		}
	}

	~stack()
	{
	   //销毁空间
		free(_arry);
		_size = _capacity = 0;
	}

	int* _arry;
	int _size;
	int _capacity;
};

int GetSNum(stack s)
{
	
	return s._size;

}

int main()
{

	stack s1;
	GetSNum(s1);


}

上述代码只是创造了一个stack类的对象,然后用值传递的方式求对象的一个成员变量,但却报错了,原因便是析构函数。值传递到形参后,形参的_arry变量和实参的_arry变量存放的内容一样,均是s1构造函数开辟的那份空间,而形参在函数结束后销毁,进行一次析构函数调用,而实参在main函数结束后也销毁,进行一次析构函数调用,两次析构调用free了同一份空间,因此产生了报错。那么这种现象该如何避免,方法一就是形参采用引用的方式,因为引用是取一份别名,因此函数调用完后不会销毁,析构函数也不会调用,就不会出现free两次的情况了。方法二就是重写拷贝构造函数(通过重写拷贝构造使得形参的_arry开辟一块新的空间)。

拷贝构造函数是默认成员函数的其中之一,即不写的话编译器会调用默认拷贝构造函数。其的特点是只有一个参数,是同类型对象的引用。(注:必须是引用不能是值,不然会出现无限拷贝的情况)。同时,为了防止引用的对象的值被修改,常用const修饰。一般来说,自定义类型需要进行值传递的话,必须重写拷贝构造函数。

拷贝构造函数的调用方式有两种:

1.类名+对象名(对象);

2类名+对象名=对象;

两种方法的结果相同,可以任选一种使用。

默认拷贝构造函数:

1.成员是内置类型会进行值传递,成员是自定义类型会调用其拷贝构造函数。

2.拷贝构造函数重写常是有malloc、fopen的成员变量。

2.运算符重载:

运算符重载的本质是函数,用于对自定义类型的对象进行运算。

写法:返回类型+operator+运算符+()。

特点:

1.不能创造新的运算符。

2.至少要有一个参数是自定义类型。(防止重载后的运算符和原有的运算符算法产生冲突,如重载两个整形的加法为减法,就会和原本加法产生冲突,因此不行)。

3.不能修改运算符对应的操作数的个数(如加法操作数是两个,不能重载成别的个数)。

4.":: " ,"sizeof" , " ." , " *. "不能重载。

5.运算符可以作为成员函数,此时形参内的参数要比实际的参数少一个,因为有一个是隐含的this指针。此时的调用方式有 对象名 操作符 对象名、对象名.operator操作符(对象名)。

本篇讲述了拷贝构造函数,初步了解了运算符重载

相关推荐
一起养小猫1 分钟前
《Java数据结构与算法》第四篇(三)二叉树遍历详解_CSDN文章
java·开发语言·数据结构
im_AMBER2 分钟前
Leetcode 80 统计一个数组中好对子的数目
数据结构·c++·笔记·学习·算法·leetcode
消失的旧时光-19435 分钟前
从 Android 回调到 C 接口:函数指针 + void* self 的一次彻底理解
android·c语言·开发语言
我命由我123457 分钟前
Python Flask 开发问题:ImportError: cannot import name ‘escape‘ from ‘flask‘
服务器·开发语言·后端·python·flask·学习方法·python3.11
elangyipi12314 分钟前
JavaScript 高级错误处理与 Chrome 调试艺术
开发语言·javascript·chrome
猫头虎15 分钟前
IntelliJ IDEA 2025.3 最新变化:值得更新吗?
java·开发语言·ide·人工智能·intellij-idea·idea·gitcode
shandianchengzi16 分钟前
【记录】Rust|Rust开发相关的7个VSCode插件的介绍和推荐指数(2025年)
开发语言·vscode·rust
爱吃烤鸡翅的酸菜鱼17 分钟前
Spring Boot 注解全栈指南:涵盖 Bean 注册、配置加载、请求映射、事务控制、数据校验等一网打尽
java·开发语言·spring boot·后端·spring
有味道的男人17 分钟前
淘宝图片搜索(拍立淘)+ 店铺全商品爬虫 深度实战指南(Python)
开发语言·爬虫·python
尘诞辰20 分钟前
【C语言】数据在内存中的储存
c语言·开发语言·数据结构·c++