C++的六大“天选之子“之“构造“与“析构“

这篇具有很好参考价值的文章主要介绍了C++的六大“天选之子“之“构造“与“析构“。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++的六大“天选之子“之“构造“与“析构“,C++,c++,开发语言,c语言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解C++中有关类和对象的介绍,本篇是中篇的第一篇文章.
金句分享:
✨别在最好的年纪,辜负了最好的自己.✨

一、“构造函数"与"析构函数”

1.1 “构造函数”

不知道友友们有没有过这样一段经历.
在写一道数据结构的oj题时,信心满满的提交后,发现,编译居然编译不过,找了半天发现是忘记了进行初始化操作.
很多时候我们经常忘记初始化操作,但是初始化操作每次又是必做的,那么C++的祖师爷(本贾尼大佬)就贴心的给我设计了一个函数,这个函数就是构造函数.

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

C++的六大“天选之子“之“构造“与“析构“,C++,c++,开发语言,c语言

(1) 自动生成的"构造函数"

构造函数编译器会自动调用,那我们不写构造函数会怎样呢?

下面这段代码会报错吗?

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

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

C++的六大“天选之子“之“构造“与“析构“,C++,c++,开发语言,c语言
答案:

并不会报错,因为构造函数即使如果在类中没有显式定义,编译器也会自动生成一个默认的析构函数

运行结果:

-858993460–858993460–858993460
-858993460–858993460–858993460

但是.构造函数对于内置类型(例如:int ,double,指针等等)并不做处理,对于自定义类型(结构体,类,联合,枚举等等),会调用自定义类型自己的构造函数.

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

class Time
{
public:
	Time()//Time类的默认构造函数
	{
		cout << "Time的构造函数" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
	void Print()
	{
		cout << _hour << "-" << _minute << "-" << _second << endl;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
		_time.Print();//打印时间
	}
private:
	int _year;
	int _month;
	int _day;
	Time _time;
};

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

运行结果:

Time的构造函数
-858993460–858993460–858993460
0-0-0

Time的构造函数
-858993460–858993460–858993460
0-0-0

解释:
虽然Date类我们没有写构造函数,但是编译器自动生成了一个隐藏的构造函数并且对自定义类型(这里是Time类)会调用自己的构造函数,所以Time类中的成员已经初始化了.

(2) 自定义"构造函数"

前面提到,内置类型,默认构造函数是不进行处理的,而这显然是设计的不合理的,所以在C++11中,打了个补丁,内置类型成员变量在类中声明时可以给默认值(缺省值),记住这里是默认值,并不是真的存储变量,因为声明是没有空间存储变量的.类只是图纸,并不能住人,只有实例化成对象后,才可以住人.

示例:下面这段代码并没有显示定义构造函数.

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year=2020;//类中只是声明,并不存储变量,这里给出的是缺省值(很重要)
	int _month=10;
	int _day=1;
};

int main()
{
	Date d1;
	d1.Print();
	printf("\n");
	Date d2;
	d2.Print();
	return 0;
}

运行结果:

2020-10-1

2020-10-1

常见的三种默认构造函数:

  1. 无参构造函数
  2. 全缺省构造函数
  3. 带参构造函数

当然,学过函数重载的友友 们一定知道全缺省和无参会存在调用不明确的情况.

class Date
{
public:
	Date()//无参构造函数
	{
		_year = 2020;
		_month = 1;
		_day = 1;
	}
	Date(int year=2020,int month=1,int day=1)//全缺省构造函数
	{
		_year = year;
		_month = month;
		_day = day;
	}
	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;
};

运行结果:

总结:

  1. 构造函数的函数名与类名相同。无返回值(不是void)。
  2. 对象实例化时编译器自动调用对应的构造函数。
  3. 构造函数可以重载。(为了解决满足多样的初始化要求)
  4. 默认构造函数是对内置类型不进行处理,C++11中,打了个补丁,内置类型成员变量在类中声明时可以给默认值(缺省值)
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成,所以无参,全缺省,默认构造函数只能有一个.

1.2 “析构函数”

同样,我们设计构造函数的目的是帮助我们自动调用初始化操作,因为初始化操作经常忘记且又是必须的.那析构函数呢?
析构函数是很多时候我们经常忘记销毁操作,如果是动态申请的空间,很容易导致内存泄漏,那么我们亲爱的C++的祖师爷(本贾尼大佬)就又给我们设计了一个函数,这个函数就是析构函数.

析构函数:

与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时自动调用析构函数,完成对象中资源的清理工作。

构造函数名与类名相同,那析构函数呢?
析构函数名是在类名前加上字符 ~。

示例:

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

typedef int DataType;
class Stack
{
public:
	Stack(int capacity=5)//全缺省构造函数
	{
		cout << "Stack" << endl;
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (NULL == _array)
		{
			perror("malloc申请空间失败!!!");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(DataType data)//压栈操作
	{
		CheckCapacity();
		_array[_size] = data;
		_size++;
	}
	~Stack()//析构函数
	{
		cout << "~Stack"<< endl;
		if (_array)
		{
			free(_array);
			_array = NULL;
			_capacity = 0;
			_size = 0;
		}
	}
private:
	void CheckCapacity()
	{
		if (_size == _capacity)
		{
			int newcapacity = _capacity * 2;
			DataType* temp = (DataType*)realloc(_array, newcapacity *
				sizeof(DataType));
			if (temp == NULL)
			{
				perror("realloc申请空间失败!!!");
				return;
			}
			_array = temp;
			_capacity = newcapacity;
		}
	}
private:
	DataType* _array;
	int _capacity;
	int _size;
};
int main()
{
	Stack s;
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);
	return 0;
}

运行结果:

Stack
~Stack

我们不难发现,即使我们不写函数调用,构造函数析构函数都会被自动调用.不愧是祖师爷的亲儿子,两个函数都有特权.

总结:

  1. 析构函数名是类名前加上字符 ~。无参数无返回值类型。
  2. 构造函数不同的是,析构函数不支持函数重载,所以一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数
  3. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
  4. 编译器生成的默认析构函数自定义类型会调用它自己的析构函数,析构函数对于内置类型,不会有任何影响,因为内置类型的对象没有需要释放的资源。
  5. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。但是呢,牛牛建议还是都写吧,否则忘记写就可能发生内存泄漏,反正不难.

本篇文章只提到了"构造"与"析构"函数这两个天选之子,还有四个没有登场哦!敬请期待吧!

C++的六大“天选之子“之“构造“与“析构“,C++,c++,开发语言,c语言文章来源地址https://www.toymoban.com/news/detail-606459.html

到了这里,关于C++的六大“天选之子“之“构造“与“析构“的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 类构造函数 & 析构函数

    类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地理解构造函数的概念: 当上面的代码

    2024年01月17日
    浏览(55)
  • C++初阶——构造和析构函数

    目录 1. 我们在经常忘记写或者调用初始化函数使得栈类中的变量是随机值,易出错有时忘记调用销毁函数,导致内存泄漏 2.构造函数 2.2 构造函数的特性 3. 析构函数 3.1 概念 3.2 特性 3.3 深入了解  这里就引出了 构造和析构函数 2.1 特性: 函数名与类名相同 无返回值 对象实例化

    2024年02月14日
    浏览(39)
  • 【C++】:构造函数和析构函数

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数 : 用户没有显式实现,编译器会生成的成员函数称为默认成员函数 。 这篇文章介绍的是 构造函数 和 析构函数

    2024年04月27日
    浏览(43)
  • 【C++初阶】类和对象——构造函数&&析构函数&&拷贝构造函数

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++头疼记 ========================================================================= 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构

    2024年02月06日
    浏览(57)
  • C++ 类和对象(二)构造函数、析构函数、拷贝构造函数

            本文将介绍类的6个默认成员函数中的构造函数、析构函数和拷贝构造函数,赋值重载和取地址重载涉及运算符重载的知识,将在下篇讲解。所谓默认成员函数,也就是每个类都有的成员函数,我们可以显式定义这些函数,否则,编译器会自动生成它们。 目录 前言

    2024年02月09日
    浏览(46)
  • [C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数

     个人主页:北·海  🎐CSDN新晋作者  🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:C/C++ 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 目录 构造函数有什么作用? 构造函数有什么特点 构造函数的种类 一.默认构造函数 1.什么是

    2024年02月09日
    浏览(45)
  • 【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗? 并不是 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 我们实现了,编译器就不会生成了 构造函数是

    2024年02月21日
    浏览(50)
  • 【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

       🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:   目录 类的6个默认成员函数 构造函数 特性  析构函数 特性  析构的顺序 拷贝构造函数 特性 常引用      💬 hello! 各位铁子们大家好哇。              今日更新了类与对象的构造函数、

    2024年02月21日
    浏览(46)
  • C++ 构造函数和析构函数 详解

    C++中用构造函数和析构函数来初始化和清理对象,这两个函数将会被编译器自动调用。对象的初始化和清理是非常重要的,如果我们不提供构造函数与析构函数,编译器会自动提供两个函数的空实现。 构造函数:主要作用于创建函数时对对象成员的属性赋值。 析构函数:主

    2024年02月02日
    浏览(52)
  • 【C++初阶】构造函数和析构函数

    📖 默认成员函数 用户没有显式实现,编译器会自动生成的成员函数,称为默认成员函数。 构造函数 :完成对象的初始化工作。 析构函数 :完成对象空间的清理工作。 拷贝构造 :使用同类对象初始化创建对象。 赋值重载 :把一个对象赋值给另外一个对象(该对象已存在

    2024年02月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包