首页 > 编程语言 >C++构造和析构

C++构造和析构

时间:2024-08-16 14:53:57浏览次数:8  
标签:调用 int 构造 C++ 析构 拷贝 和析构 构造函数

文章目录

一、构造函数

1、构造函数的功能

构造函数是一个类的成员函数,在类创建好后(就是开劈好空间)自动调用构造函数对类的成员变量进行初始化。

2、构造函数的创建

构造函数的名字跟它所在的类的名字一样,构造函数没有返回值(viod 也不用写),构造函数支持重载,就是根据传参来区分调用哪一个构造函数。

#include <iostream>

class Date
{
public:
	//不传参的构造函数
	Date()
	{
		_year = 2020;
		_month = 1;
		_day = 1;
	}
	//传参
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	Date d2(2024, 8, 12);

	
	return 0;
}

在不传参时调用构造函数不用加括号。

//Date d1();
//如果没有参数调用时加括号有歧义
//可能是一个函数申明
//返回类型为Date,无参的名为d1的函数声明
3、默认构造函数
  • 当我们没有显示写构造函数时,系统自动生成一个默认构造函数来初始化成员变量。
    我们写了构造编译器就不会生成默认构造。

编译器自动生成的构造函数对内置类型有可能不做处理,对自定义类型会调用对应的构造函数
内置类型是int/char/double/指针等类型,自定义类型是class/struct关键字创建的类型
所以构造函数往往需要自己写

默认构造有三个:

  • 我们不写构造编译器默认生成的构造
  • 无参的默认构造
  • 全缺省构造在调用时不传参

总结就是不传实参就调用的构造叫默认构造
无参和全缺省的构造不能同时存在,它们虽然构成重载,但在不穿任何参数时调用会产生歧义
没有默认构造存在编译器会报错

二、析构函数

1、析构函数的功能

析构完成类对象的销毁,在声明周期结束时会自动销毁,一般对栈帧上的空间就是释放,对没有使用资源的我们不用管,系统自动生成的析构就够了,使用资源的就需要自己显示写析构,资源就是malloc或fopen申请的空间。

2、析构函数的的创建

析构函数的名字是类的名字前加一个~,是跟构造函数相反,也不用加返回值(void 也不用加),不用重载,一个类有一个析构就可以了,在声明周期结束时会自动调用。
没有写析构编译器会自动生成一个默认析构,对内置类型不做处理,对自定义类型会自动调用对应的析构。

#include <iostream>

class stack
{
public:
	stack(int n = 4)
	{
		_a = (stackDataType*)malloc(n * sizeof(stackDataType));
		if (_a == NULL)
		{
			perror("satck :: malloc fail");
			exit(1);
		}
		_capacity = n;
		_top = 0;
	}
	//析构
	~stack()
	{
		free(_a);
		_a = nullptr;
		_capacity = _top = 0;
	}
private:
	typedef int stackDataType;
	stackDataType* _a;
	int _capacity;
	int _top;
};
int main()
{
	stack s;

	return 0;
}

⼀个局部域的多个对象,C++规定后定义的先析构。
在类里创建了析构,但编译器也会去调用自定义类型对应的析构。

#include <iostream>

class stack
{
public:
	stack(int n = 4)
	{
		_a = (stackDataType*)malloc(n * sizeof(stackDataType));
		if (_a == NULL)
		{
			perror("satck :: malloc fail");
			exit(1);
		}
		_capacity = n;
		_top = 0;
	}
	//析构
	~stack()
	{
		free(_a);
		_a = nullptr;
		_capacity = _top = 0;
		std::cout << "~stack()" << std::endl;
	}
private:
	typedef int stackDataType;
	stackDataType* _a;
	int _capacity;
	int _top;
};

class MyQueue
{
public:
	~MyQueue()
	{
		std::cout << "~MyQueue()" << std::endl;
	}
private:
	stack p1;
	stack p2;
};
int main()
{
	MyQueue q;

	return 0;
}

在这里插入图片描述

给MyQueue写了析构,但还是调用了两次~stack(),所以对于自定义类型无论如何都会调用它对应的析构。

三、拷贝构造函数

1、拷贝构造的功能

拷贝构造函数是特殊的构造函数,在类的对象初始化时自动调用拷贝构造函数将类已经实例化后对象的值拷贝给新创建的对象。在函数调用时,函数形参的类型是类时也会先调用拷贝构造。

拷贝构造函数跟析构函数一样,往往时类有指向资源时,需要自己写拷贝构造。
如果指向的资源了·不自己写拷贝构造,而系统自动生成的拷贝构造是浅拷贝,多个类对象指向同一块空间,不是期望的结果。

2、拷贝构造的创建
  • 拷贝构造函是构造函数的一个重载,形参的类型就是类的引用。

在C++中传值传参时都会自动调用拷贝构造函数,如果不引用传参就会不停递归拷贝构造函数,形参死归。

在这里插入图片描述
上面图片的拷贝构造写的有问题,在函数调用类做返回值时调用拷贝构造会产生权限放大的错误,所以可以用const修饰更安全
在这里插入图片描述

3、深拷贝

对于占用资源的类对象进行拷贝时就要自己写拷贝构造完成的目的就是深拷贝。
就像栈这样的数据结构要进行拷贝时,确保两个对象不指向同一块空间。

在这里插入图片描述

标签:调用,int,构造,C++,析构,拷贝,和析构,构造函数
From: https://blog.csdn.net/2401_83305953/article/details/141089827

相关文章

  • C++图像识别、图像识别接口、ocr api
    如果您在找工作并且在找内容审核编辑的工作,那么不难发现,快手在全国多个招聘网站发布了关于“内容审核编辑”岗位的招聘信息,据悉,此次的“内容审核编辑”岗位招聘的规模达3000人。因为快手上面“低龄妈妈”内容的炒作,所以被要求整改,才有后续的大规模招聘内容审核编辑人员的现象......
  • 【C++的剃刀】我不允许你还不会map和set
     ​ 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台   循环渐进Forward-CSDN博客Hello,这里是kiki,今天继续更新C++部分,我们继续来扩充我们的知识面,我希望能努力把抽象繁多的知识讲的生动又通俗易懂,今天要讲的是C++的map和set~目录 循环渐进Forward-CSDN博客关......
  • C/C++算法概述
    摘要1.性能优势:C/C++语言以其接近硬件的特性而著称,提供了对底层硬件的直接控制能力。这意味着算法可以实现更高的执行效率,特别是在需要处理大量数据或实时性能要求较高的场景中。2.灵活性:C/C++提供了丰富的数据结构和操作,允许开发者以灵活的方式实现复杂的算法。同时,C++的......
  • 红温刷算法题(C/C++)
    此文章主要是给刷算法题的小萌新写的题解,博主每日刷题,把所刷的题以及所获都会发到博客里面,文章有详解思路,并且有对应的AC代码,希望我的博客对算法小萌新有所帮助。感谢CSDN平台给我这个机会,我会努力创作,创作高质量文章。 P1002[NOIP2002普及组]过河卒题目描述棋盘上 A ......
  • C++基础资料二
    C++等级考试资料二考试内容:选择题:进制转换、冒泡与选择排序、二分思想、链表与顺序表、二维数组初始化、函数阅读编程题:字符串操作、质数判断、排序、最小公倍数、最大公约数、百钱百鸡问题 考试资料:进制转换公式1.十进制转二进制整数部分:不断将十进制数除以2,记录余......
  • Spring DI 简单演示三层架构——构造注入
    SpringIOC的常见注入方法有3种:Setter注入、构造注入和属性注入。想了解更多可点击链接:Spring注入、注解及相关概念补充        属性注入 不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠IOC容器实现注入,不严谨。所以我只演示Setter注入和构造......
  • C++中的IO流
    目录1.C语言的输入与输出2.流是什么3.C++IO流标准IO流IO流的四个标志C++文件IO流4.stringstream的简单介绍1.C语言的输入与输出C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。scanf():从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(......
  • C++之内存四区
    目录一、内存四区二、程序运行前三、程序运行后四、new操作符一、内存四区在计算机科学中,特别是在c或c++语言编程时,内存通常大致分为四个区域,而不同的区域存放的数据赋予不同的生命周期,给我们更大的灵活编程:代码区:存储程序的可执行代码(二进制代码),也就是程序编译后的......
  • SSM-国外鞋服代购平台-97782(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    SSM国外鞋服代购平台摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,鞋服代购平台当然也不例外。代购平台是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过......
  • C++ string类型常用操作
    string类型操作字符串切割str.substr(索引,切割的个数) -> 返回字符串注意:第二个参数为切割的个数stringbuf="abcdefg";buf.substr(0,2);//结果为"ab"buf.substr(1,3);//结果为"bcd"字符串输入使用getline读入字符串可以保留字符串中的空格 getline(cin......