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++泛型编程基本概念详解

    C++泛型编程基本概念详解

    这一篇介绍一下 C++ 编程中与面向对象并列的另一大分支——泛型编程,这一篇主要介绍函数模板、类模板和成员模板三大部分,需要的朋友可以参考下
    2021-08-08
  • C++ xxx_cast实现转换代码实例解析

    C++ xxx_cast实现转换代码实例解析

    这篇文章主要介绍了C++xxx_cast转换代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • C++构造函数抛出异常需要注意的地方

    C++构造函数抛出异常需要注意的地方

    这篇文章主要介绍了C++构造函数抛出异常需要注意的地方,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C语言实现随机发扑克牌

    C语言实现随机发扑克牌

    这篇文章主要为大家详细介绍了C语言实现随机发扑克牌,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++实现LeetCode(5.最长回文子串)

    C++实现LeetCode(5.最长回文子串)

    这篇文章主要介绍了C++实现LeetCode(5.最长回文子串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 基于对话框程序中让对话框捕获WM_KEYDOWN消息的实现方法

    基于对话框程序中让对话框捕获WM_KEYDOWN消息的实现方法

    下面我们将通过程序给大家演示基于对话框的应用程序对WM_KEYDOWN消息的捕获。需要的朋友可以参考下
    2013-05-05
  • C语言浮点函数中的modf和fmod详解

    C语言浮点函数中的modf和fmod详解

    这篇文章主要为大家详细介绍了C语言浮点函数中的modf和fmod,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++在非面向对象方面对C语言的扩充

    C++在非面向对象方面对C语言的扩充

    C++是一种面向对象编程语言,但它也可以作为C语言的扩展语言。在C++中,我们可以使用非面向对象方面的特性来扩展C语言。在本文中,我们将讨论C++在非面向对象方面对C语言的扩充
    2023-05-05
  • C语言实现ATM机存取款系统

    C语言实现ATM机存取款系统

    这篇文章主要为大家详细介绍了C语言实现ATM机存取款系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C/C++实现快速排序的方法

    C/C++实现快速排序的方法

    这篇文章主要介绍了C/C++实现快速排序的方法,这几天在找工作,被问到快速排序,结果想不出来快速排序怎么弄的;回来搜索了一下,现在记录下来,方便以后查看。
    2014-12-12

最新评论