C++浅析构造函数的特性

 更新时间:2022年07月08日 08:55:39   作者:幻荼  
构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用;析构函数主要作用在于对象销毁前系统自动调用,执行一 些清理工作

构造函数的概念

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

构造函数的特性

(1)函数名与类名相同。

(2)无返回值。

(3)编译器自动调用对应的构造函数。

(4)构造函数可以重载。

我们这里直接举一个例子

#include<iostream>
using namespace std;
class Data
{
public:
	Data()
	{
		cout << "Date()" << this << endl;
	}
	void InitData(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void PrintfData()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1,d2;
	d1.InitData(2022,5,21);
	d1.PrintfData();
	return 0;
}

于是得到的的结果为:

只能有一个构造函数

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

下面举一个错误案例:

#include<iostream>
using namespace std;
class Data
{
public:
	Data()
	{
		cout << "Date()" << this << endl;
	}
Data()
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void InitData(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void PrintfData()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1
	return 0;
}

上面的代码中,有两个默认的构造函数,因为不带参数的构造函数和全缺省的构造函数都被看为默认的构造函数,所以说,现在有两个构造函数,编译器不知道到底要去调用哪个构造函数,所以说,就会报错,所以我们删除一个就可以了。

关于编译器生成的默认成员函数,很多人会有疑惑:在我们不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?对象调用了编译器生成的默认构造函数,但是对象year/month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用?

解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如int/char...,自定义类型就是我们使用class/struct/union自己定义的类型,看看下面的程序,就发发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数

class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本类型(内置类型)
	int _year;
	int _month;
	int _day;
	// 自定义类型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

什么意思呢,就是编译器会不管int,char这种基本类型,而会去管自定义类型

这是输出的结果

到此这篇关于C++浅析构造函数的特性的文章就介绍到这了,更多相关C++构造函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析C++元组tuple类型

    浅析C++元组tuple类型

    元组tuple是C++的一个模板,不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员,今天通过本文给大家介绍C++元组tuple类型,感兴趣的朋友一起看看吧
    2022-06-06
  • C++ Coroutine简单学习教程

    C++ Coroutine简单学习教程

    这篇文章主要为大家详细介绍了C++ Coroutine的简单学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解

    这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C/C++编译器GCC下的常用编译命令总结

    C/C++编译器GCC下的常用编译命令总结

    这篇文章主要介绍了C/C++编译器GCC下的常用编译命令总结,本文的示例环境为Linux系统,需要的朋友可以参考下
    2015-08-08
  • C++实现小型复数计算器

    C++实现小型复数计算器

    这篇文章主要为大家详细介绍了C++实现小型复数计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 浅谈单调队列、单调栈

    浅谈单调队列、单调栈

    其实,单调队列和单调栈是类似的,在我看来,这两个东西只是名字不一样 - - ! 比较容易想的一道题啦! 首先,这题的两个关键点: 1、区间的和。这个简单,地球人都知道! 2、区间的最小值。
    2015-07-07
  • C语言实现一个简单的扫雷游戏

    C语言实现一个简单的扫雷游戏

    扫雷是电脑上很经典的游戏,特意去网上玩了一会,几次调试之后,发现这个比三子棋要复杂一些,尤其是空白展开算法上和堵截玩家有的一拼,与实际游戏差别较大,不能使用光标,下面来详解每一步分析
    2021-10-10
  • C++实现简单的学生成绩管理系统

    C++实现简单的学生成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单的学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • c++ base64编解码使用示例

    c++ base64编解码使用示例

    这篇文章主要介绍了c++的base64编解码使用示例,需要的朋友可以参考下
    2014-02-02
  • 详解C++中new运算符和delete运算符的使用

    详解C++中new运算符和delete运算符的使用

    这篇文章主要介绍了C++中new运算符和delete运算符的使用,文章来自于微软开发者文档,因而根据Visual C++的一些特性来进行讲解,需要的朋友可以参考下
    2016-01-01

最新评论