当前位置 : 主页 > 编程语言 > c语言 >

C++ ---->大类 ~~ 大对象(中)__01

来源:互联网 收集:自由互联 发布时间:2023-09-06
各位好友,欢迎来到本期博客 !本章节 将为大家介绍, 类的六大默认成员函数 ! 为什么 类 会引入 默认成员函数 ? a. 函数的调用会开辟空间,用来存储数据 !而开辟的空间叫做栈

各位好友,欢迎来到本期博客 !本章节 将为大家介绍, 类的六大默认成员函数 !

为什么 类 会引入 默认成员函数 ?

a. 函数的调用会开辟空间,用来存储数据 !而开辟的空间叫做栈区!当函数的生命周期结束的时候,栈区需要进行销毁,将空间归还给 操作系统。如此,可以防止 内存泄露 !

b. 其实,往往内存泄露的情况时有发生,主要还是程序员自身忘记书写了 ;另一方面,默认成员函数的引入,会极大简化代码量 ,凸显主要的逻辑运行 !

对于 内存泄露问题,在 编译器的控制台显示下,会检测不出来 !只有对底层原理,反汇编有一定的深入了解,才能看得懂 !

由于篇幅限制,太长了,会产生疲劳感 !因此,类的六大默认成员函数,会分模块进行梳理 !

------>大类 ~ 六大默认成员函数

C++ ---->大类 ~~ 大对象(中)__01_构造函数

---->构造函数

---> 构造函数是特殊的成员函数,需要注意,构造函数 虽然有 “构造”  两个字,但是函数的前期任务已经完成,并不再是 开空间 建对象,而是初始化对象

---> 特性:

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;
}


为了方便好友们,更好地观感体验, 与更好地理解 !现附上有彩色的代码图样 :>

----> 无参数传入, 编译器默认参数

C++ ---->大类 ~~ 大对象(中)__01_构造函数_02

----> 有参数传入,编译器调用构造函数

C++ ---->大类 ~~ 大对象(中)__01_五大特性_03

对于构造函数中 有无参数 传入,均是满足 :>

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;
};

为了方便好友们,有更好的观感体验, 与更好地理解 !继续推进,全部是 有彩色的代码图样 :>

----> 构造函数,实现栈区

C++ ---->大类 ~~ 大对象(中)__01_构造函数_04

运行结果 :>

C++ ---->大类 ~~ 大对象(中)__01_构造函数_05

下面来看,运用构造函数,实现栈区的应用场景

----> 运用构造函数,实现栈区

C++ ---->大类 ~~ 大对象(中)__01_构造函数_06

--> 运行结果 :>

C++ ---->大类 ~~ 大对象(中)__01_构造函数_07

以上,是本次 实现构造函数 应用场景 !然而,构造函数 运用还不至于此 !

以下,探究 特性 3 :> 实现构造函数重载

--> 实现环节 :>

C++ ---->大类 ~~ 大对象(中)__01_五大特性_08

--> 测试环节 : >

C++ ---->大类 ~~ 大对象(中)__01_五大特性_09

--> 运行结果 :>

C++ ---->大类 ~~ 大对象(中)__01_构造函数_10

接下来,探究 特性 5 :>如果 类中没有定义构造函数,则编译器自动调用默认构造函数;一旦 编写者自身书写,则不会再 自动调用默认构造函数 。

----->自动调用构造,生成随机值


C++ ---->大类 ~~ 大对象(中)__01_五大特性_11

--->注意 :> 自定义类型的情况下,VS2019 编译器,会将其初始化0 (不同年份,不同版本会有所不同)

--->添加自定义类型,如下 :>

C++ ---->大类 ~~ 大对象(中)__01_五大特性_12

---->运行结果 : >

C++ ---->大类 ~~ 大对象(中)__01_五大特性_13


各位好友,构造函数 部分讲解 已完成 !其中,最重要的点,是本期 构造函数 五大特性 ! 

其实,构造函数 还有另外两个特性 !然而,本期博客篇幅太长,容易产生疲劳感 !

为了方便好友们 观感体验,构造函数 -->另外两点,需要在下一期与大家相见!

上一篇:动态内存访问
下一篇:没有了
网友评论