C++中默认无参构造函数的工作机制浅析

 更新时间:2023年02月28日 08:35:12   作者:北冥有鱼丶丶  
构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用;析构函数主要作用在于对象销毁前系统自动调用,执行一些清理工作

在不实现构造函数的情况下,编译器会自动生成一个默认无参构造函数。但是看起来编译器自动生成的无参默认构造函数似乎没有什么用,比如创建p对象时调用了编译器生成的无参默认构造函数,但是p对象的成员变量依旧是随机值。

class Person
{
private:
	int age;
public:
	int getAge()
	{
		return age;
	}
};
int main()
{
	Person p;
	cout << p.getAge() << endl;
	return 0;
}

默认无参构造函数真的没有用吗?

我们可以通过下面的代码来探究默认无参构造函数的作用。

#include<iostream>
#include<string>
using namespace std;
class Person
{
	int age;
public:
	Person() { cout << "自定义类型成员的默认无参构造函数被调用" << endl; }
	//Person(int _age = 0) :age(_age) { cout << "自定义类型成员的全缺省默认构造函数被调用" << endl; }
	int getAge()
	{
		return age;
	}
};
class Student
{
	Person p;
	int id;
public:
	Student(){}
	int getId()
	{
		return id;
	}
	int getAge()
	{
		return p.getAge();
	}
};
int main()
{
	Student s;
	cout << "id:" << s.getId() << endl;
	cout << "age:" << s.getAge() << endl;
	return 0;
}

上面代码利用默认无参构造函数创建对象s,根据第一句输出,我们可以得知默认无参构造函数会先对自定义类型的数据成员会调用自定义数据类型的默认构造函数来处理自定义类型数据成员。根据第二句输出,我们可以知道默认无参构造函数对基本类型数据成员没有作处理,只是在初始化列表中用随机值对其进行了初始化,第三句输出,是默认无参构造函数调用了自定义类型的默认构造函数对自定义数据成员处理的结果,由于自定义类型的默认构造函数也是默认无参构造函数,所以它不会对基本数据类型成员age作处理,只是在初始化列表中用随机值对其进行初始化。

我们把第八行代码屏蔽,放出第九行全缺省默认构造函数试试看,输出如下:

上面代码利用默认无参构造函数创建对象s,根据第一句输出,我们可以得知默认无参构造函数会先对自定义类型的数据成员会调用自定义数据类型的默认构造函数来处理自定义类型数据成员,与之前不同的是,之前自定义数据类型的默认构造函数是默认无参构造函数,这里自定义类型的默认构造函数,是自己定义的全缺省的默认构造函数。根据第二句输出,我们可以知道默认无参构造函数对基本类型数据成员没有作处理,只是在初始化列表中用随机值对其进行了初始化,第三句输出,是默认无参构造函数调用了自定义类型的全缺省默认构造函数对自定义数据成员处理的结果。

由此我们可以得出结论:

C++把类型分成基本类型和自定义类型。

默认无参默认构造函数对基本类型成员变量不做处理(在初始化列表中用随机值对其进行初始化),C++11 中针对基本类型成员不初始化的缺陷,又打了补丁,即:基本类型成员变量在类中声明时可以给默认值。

默认无参构造函数对于自定义类型成员变量才会处理,它会去调用自定义类型的默认构造函数去初始化创建自定义类型的成员变量(对象)。

何时使用编译器自动生成的无参默认构造函数就够了,何时需要自己实现构造函数呢?

如果一个类中的成员全是自定义类型,或者基本类型成员在声明时已经给了缺省值,即无需对基本类型成员变量做处理,且自定义成员都提供了默认构造函数,此时使用编译器自动生成的无参默认构造函数就可以了。

如果有基本类型的成员变量且需要显示传参初始化,即我们需要自己对基本类型成员变量进行处理,或者自定义类型成员没有默认构造函数,那么就要自己实现构造函数。

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

相关文章

  • Linux系统下如何使用C++解析json文件详解

    Linux系统下如何使用C++解析json文件详解

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。下面这篇文章主要给大家介绍了关于Linux系统下如何使用C++解析json文件的相关资料,需要的朋友可以参考下
    2021-06-06
  • 70行C语言代码实现贪吃蛇

    70行C语言代码实现贪吃蛇

    这篇文章主要为大家详细介绍了70行C语言代码实现贪吃蛇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C++异常处理方式实例详解(超级详细!)

    C++异常处理方式实例详解(超级详细!)

    程序有时会遇到运行阶段错误,导致程序无法正常执行下去,c++异常为处理这种情况提供了一种功能强大的而灵活的工具,下面这篇文章主要给大家介绍了关于C++异常处理方式的相关资料,需要的朋友可以参考下
    2023-04-04
  • Atom安装配置C/C++详细教程

    Atom安装配置C/C++详细教程

    Atom (一款开源的代码编辑器)是github专门为程序员推出的一个跨平台文本编辑器。这篇文章主要介绍了Atom安装配置C/C++教程,需要的朋友可以参考下
    2020-05-05
  • C++对象排序的比较你了解吗

    C++对象排序的比较你了解吗

    这篇文章主要为大家详细介绍了C++对象排序的比较,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • pcl1.8.0+vs2013环境配置超详细教程

    pcl1.8.0+vs2013环境配置超详细教程

    这篇文章主要介绍了pcl1.8.0+vs2013环境配置超详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • KMP 算法实例详解

    KMP 算法实例详解

    这篇文章主要介绍了KMP 算法实例详解的相关资料,MP的关键是求出next的值、先预处理出next的值,需要的朋友可以参考下
    2017-07-07
  • C++的new和delete详解

    C++的new和delete详解

    这篇文章主要介绍的是C++的new和delete,可以这么理解 new相当于是malloc 、delete相当于是free,下面我们就来详情介绍,,需要的朋友可以参一考
    2021-09-09
  • C语言转义字符实例详解

    C语言转义字符实例详解

    这里主要介绍了C语言的转义字符的知识,并附有示例代码,以便理解,希望对学习 C语言的同学有所帮助
    2016-07-07
  • C语言栈顺序结构实现代码

    C语言栈顺序结构实现代码

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译),有需要的朋友可以参考一下
    2013-10-10

最新评论