【C++】构造函数详解

JhonKI 2024-08-01 13:35:02 阅读 57

📢博客主页:https://blog.csdn.net/2301_779549673

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 JohnKi 原创,首发于 CSDN🙉

📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

📢前言🏳️‍🌈 什么是构造函数🏳️‍🌈 构造函数的特点❤️1. 函数名与类名相同🧡2. 无返回值。💛3. 对象实例化时系统会自动调用对应的构造函数。💚4. 构造函数应写尽写

👥总结


📢前言

本篇博客主要介绍一下<code>C++中的构造函数拷贝构造函数的特性及用法,至于与这一部分有关的析构函数运算符重载等内容就放在下次。


🏳️‍🌈 什么是构造函数

构造函数是特殊的成员函数,构造函数千万不要认为它是用来创建对象的,其实构造函数的主要任务并不是开空间创建对象,而是初始化对象

关于构造函数,可以理解为使用类实例化对象时,每一个对象都要进行初始化,都要进行调用初始化函数,这个操作是实例化对象的必要操作,那么有没有更好的方式来简化这个调用操作。于是C++便推出了构造函数


🏳️‍🌈 构造函数的特点

❤️1. 函数名与类名相同

顾名思义你类名取什么,函数名就是什么

就比如下面这样就是一种最基本的无参构造函数,它的函数名就是类名

#include<iostream>

using namespace std;

class Date

{

public:

//⽆参构造函数

//可以认为是默认构造

Date()

{

_year = 1;

_month = 1;

_day = 1;

}

private:

int _year;

int _month;

int _day;

};

🧡2. 无返回值。

返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此,可以理解为可自定义内置初始化函数,仅用来初始化

比如说下面这就是一个带参数的构造函数

// 带参构造函数

Date(int year, int month, int day)

{

_year = year;

_month = month;

_day = day;

}

💛3. 对象实例化时系统会自动调用对应的构造函数。

比如说下面这三种基本的构造函数方法都是可行的

public:

// 1.⽆参构造函数

// 可以认为是默认构造

Date()

{

_year = 1;

_month = 1;

_day = 1;

}

// 2.带参构造函数

Date(int year, int month, int day)

{

_year = year;

_month = month;

_day = day;

}

// 3.全缺省构造函数

// 可以认为是默认构造

/*Date(int year = 1, int month = 1, int day = 1)

{

_year = year;

_month = month;

_day = day;

}*/

但是你肯定会注意到我将第三点给注释掉了,这是因为如果第一种无参第三种全缺省构造函数都存在的话就会出现判定不清的问题。

在这里插入图片描述

还有就是一般C++语言是内置构造函数的,就是说如果类中没有<code>显式定义构造函数即上述三种函数都没有,则C++编译器会自动生成⼀个无参的默认构造函数,但是其初始化数值就可能会因编译器而异

比如说笔者使用的VS2022的初始化值如下

在这里插入图片描述

另外,<code>无参构造函数全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。

无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造

💚4. 构造函数应写尽写

我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,初始化列表,我们下个章节再细细讲解。

说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

大多数情况下,构造函数都需要我们自己去实现,少数情况类似于MyQueue且Stack有默认构造时,MyQueue自动生成的就可以用,应写尽写

比如下面代码,我们限时实现了类对象Stack,并在这里面自定义了构造函数,而MyQueue里直接利用Stack来定义成员变量来,就利用了Stack里的构造函数,所以就不用定义了

#include<iostream>

using namespace std;

typedef int STDataType;

class Stack

{

public:

Stack(int n = 4)

{

_a = (STDataType*)malloc(sizeof(STDataType) * n);

if (nullptr == _a)

{

perror("malloc申请空间失败");

return;

}

_capacity = n;

_top = 0;

}

private:

STDataType* _a;

size_t _capacity;

size_t _top;

};

// 两个Stack实现队列

class MyQueue

{

public:

private:

Stack pushst;

Stack popst;

};


👥总结

本篇博文对 构造函数 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。