各位好友,欢迎来到本期博客 !本章节 将为大家介绍, 类的六大默认成员函数 !
为什么 类 会引入 默认成员函数 ?
a. 函数的调用会开辟空间,用来存储数据 !而开辟的空间叫做栈区!当函数的生命周期结束的时候,栈区需要进行销毁,将空间归还给 操作系统。如此,可以防止 内存泄露 !
b. 其实,往往内存泄露的情况时有发生,主要还是程序员自身忘记书写了 ;另一方面,默认成员函数的引入,会极大简化代码量 ,凸显主要的逻辑运行 !
对于 内存泄露问题,在 编译器的控制台显示下,会检测不出来 !只有对底层原理,反汇编有一定的深入了解,才能看得懂 !
由于篇幅限制,太长了,会产生疲劳感 !因此,类的六大默认成员函数,会分模块进行梳理 !
------>大类 ~ 六大默认成员函数
---->构造函数
---> 构造函数是特殊的成员函数,需要注意,构造函数 虽然有 “构造” 两个字,但是函数的前期任务已经完成,并不再是 开空间 建对象,而是初始化对象 !
---> 特性:
1. 函数名与类名相同;
2. 无返回值 (也不需要 void)
3. 可以构成重载;
4. 对象实例化, 编译器自动调用对应的构造函数;
5. 如果类中没有显示 定义构造函数,则 C++ 编译器会自动生成一个 无参的默认构造函数,一旦用户 显示定义 编译器将不再生成 。
本模块下, 构造函数五大特性是非常重要的 !同时,五大特性是理解与掌握 构造函数的不二法宝 !
测试构造函数 :>
--->函数名与类名 -->相同
--->无 返回值
#include <iostream>
using std::cout;
using std:: endl;
class Date
{
public:
Date(int year = 2018, int month = 6, int day = 7)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << " - " << _month << " - " << _day << endl;
}
private:
int _yaer;
int _month;
int _day;
};
int main()
{
// 无参数调用,编译器默认初始化
Date d1;
d1.Print();
// 传入参数, 编译器调用构造函数
Date d2(2023, 5, 1);
d2.Print();
return 0;
}
为了方便好友们,更好地观感体验, 与更好地理解 !现附上有彩色的代码图样 :>
----> 无参数传入, 编译器默认参数
----> 有参数传入,编译器调用构造函数
对于构造函数中 有无参数 传入,均是满足 :>
1. 构造函数名称与类名相同;
2. 构造函数,不需要考虑返回值,也不需要考虑 void ;
各位好友,构造函数 前两点,已完成验证 !
下面,转战 特性 4 进行讲解 !为了方便好友们,理解掌握:> 这 需要运用 前期学习过的知识点 !用 栈区实现 !
-----> 特性四 :对象实例化, 编译器自动调用构造函数
--->运用构造函数,实现栈区(此处并没有进行测试)
#include <iostream>
using std:: cout;
using std:: endl;
typedef int STDataType;
class Stack
{
public:
Stack(int capacity = 4)
{
cout << " 这是运用构造函数实现栈区 " << endl;
STDataType* a = (STDataType*)malloc(sizeof(STDaTaType) * capacity);
if(a == nullptr)
{
perror("malloc::fail");
return ;
}
capacity = 4;
top = 0;
}
Init()
{
STDataType* a = (STDataType*)malloc(sizeof(STDaTaType) * 4);
if(a == nullptr)
{
perror("malloc::fail");
return ;
}
capacity = 4;
top = 0;
}
void Push(STDataType x)
{
CheckCapacity();
a[top++] = x;
}
void Pop()
{
top--;
}
void TTop()
{
return a[top - 1];
}
bool Empty()
{
return top == 0;
}
int Size() //栈区内个数
{
return top;
}
private:
void CheckCapacity()
{
if(top == capacity)
{
int newCapacity = 2 * capacity;
STDataType* tamp = (STDataType*)realloc(a, sizeof(STDataType) * newCapacity);
if(tamp == nullptr)
{
perror("realloc::fail");
return ;
}
a = tamp;
capacity = newCapacity;
}
}
private:
STDataType* a;
int capacity;
int top;
};
为了方便好友们,有更好的观感体验, 与更好地理解 !继续推进,全部是 有彩色的代码图样 :>
----> 无 构造函数,实现栈区
运行结果 :>
下面来看,运用构造函数,实现栈区的应用场景 !
----> 运用构造函数,实现栈区
--> 运行结果 :>
以上,是本次 实现构造函数 应用场景 !然而,构造函数 运用还不至于此 !
以下,探究 特性 3 :> 实现构造函数重载
--> 实现环节 :>
--> 测试环节 : >
--> 运行结果 :>
接下来,探究 特性 5 :>如果 类中没有定义构造函数,则编译器自动调用默认构造函数;一旦 编写者自身书写,则不会再 自动调用默认构造函数 。
----->自动调用构造,生成随机值
--->注意 :> 有自定义类型的情况下,VS2019 编译器,会将其初始化 为 0 (不同年份,不同版本会有所不同)
--->添加自定义类型,如下 :>
---->运行结果 : >
各位好友,构造函数 部分讲解 已完成 !其中,最重要的点,是本期 构造函数 五大特性 !
其实,构造函数 还有另外两个特性 !然而,本期博客篇幅太长,容易产生疲劳感 !
为了方便好友们 观感体验,构造函数 -->另外两点,需要在下一期与大家相见!