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++默认无参构造函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言对组文件处理的相关函数小结

    C语言对组文件处理的相关函数小结

    这篇文章主要介绍了C语言对组文件处理的相关函数小结,包括setgrent()函数和getgrent()函数以及endgrent()函数,需要的朋友可以参考下
    2015-08-08
  • C语言 深入解读数据结构之堆的实现

    C语言 深入解读数据结构之堆的实现

    堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置
    2021-11-11
  • C语言实现简易停车场管理系统

    C语言实现简易停车场管理系统

    这篇文章主要为大家详细介绍了C语言实现简易停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • c++调用实现yolov5转onnx介绍

    c++调用实现yolov5转onnx介绍

    大家好,本篇文章主要讲的是c++调用实现yolov5转onnx介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 详解C++虚函数中多态性的实现原理

    详解C++虚函数中多态性的实现原理

    C++是一种面向对象的编程语言,在C++中,虚函数是实现多态性的关键。本文就来探讨一下C++虚函数中多态性的实现原理及其在面向对象编程中的应用吧
    2023-05-05
  • C++ 超详细讲解stack与queue的使用

    C++ 超详细讲解stack与queue的使用

    C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构,许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列
    2022-03-03
  • C/C++中带空格字符串的输入讲解

    C/C++中带空格字符串的输入讲解

    这篇文章主要给大家介绍了关于如何解决C++中带空格字符串的输入问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2021-09-09
  • Libevent的使用及reactor模型详解

    Libevent的使用及reactor模型详解

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,这篇文章主要介绍了Libevent的使用及reactor模型,需要的朋友可以参考下
    2024-03-03
  • MFC中动态创建控件以及事件响应实现方法

    MFC中动态创建控件以及事件响应实现方法

    这篇文章主要介绍了MFC中动态创建控件以及事件响应实现方法,详细讲解了MFC中动态创建控件以及事件响应的概念与实现方法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • C++ continue和break语句

    C++ continue和break语句

    这篇文章主要介绍了C++ continue和break语句,文章围绕continue和break语句的相关资料展开详细内容,需要的朋友可以参考一下,希望对大家有所帮助
    2021-11-11

最新评论