• 【C++札记】构造函数与析构函数


    构造函数(constructor)

    1.构造函数是种特殊的类成员函数,遵循如下规则:

         a.函数名与类名必须相同。

         b.没有返回值

    例如:
    class Obj
    {
    ...
    public:
          Obj()
          {
             ...
          }
    };


    2.构造函数可以带参数,也可以重载

    class Obj
    {
    ...
    public:
          Obj()
          {
            ...
          }
          Obj(int x, int y)
          {
            ...
          }
    };

    3.构造函数和普通成员函数不一样,一般不显示调用。在创建一个对象时,构造函数自动调用(编译器来完成)。

    析构函数(destructor)

    1.析构和构造是一对相反的过程,对象被创建时调用构造函数,对象被销毁时调用析构函数,遵循如下规则:

        a.名称固定,类名前加上波浪线~

        b.没有返回值

        c.不能带参数

    例如,
    class Obj
    {
    public:
        ~Obj()
         {
         }
    };


    2.析构函数只能有一个,不允许重载。

    3.析构函数不显示调用,对象销毁时编译器自动调用。

    重新实现链表(使用类,构造和析构函数)

    创建DataObj.h头文件

    #ifndef _OBJECT_H_
    #define _OBJECT_H_
    
    struct Student
    {
    	char name[32];
    	int  age;
    	Student* pNext;
    };
    
    class DataObj
    {
    public:
    	DataObj();
    	~DataObj();
    	void add(Student* pStu);
    	void find(int age);
    	void printNode(Student* pNode);
    private:
    	Student m_head;
    };
    
    #endif


    创建DataObj.cpp源文件

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "DataObj.h"
    
    //构造有头链表
    DataObj::DataObj()
    {
    	m_head.pNext = NULL;
    }
    DataObj::~DataObj()
    {
    	//指向每个节点的头部
    	Student* p = m_head.pNext;
    
    	//释放所有节点
    	while(p)
    	{
    		Student *next = p->pNext;
    		free(p);
    		p = next;
    	}
    	
    }
    
    void DataObj::add(Student* pNode)
    {
    	//指向每个节点的头部
    	Student* p = &m_head;
    
    	//通过头节点查找到链表尾部节点
    	while (p)
    	{
    		if (p->pNext == NULL)
    		{
    			break;
    		}
    		p = p->pNext;
    	}
    	
    	//添加节点到尾部
    	p->pNext = pNode;
    }
    void DataObj::find(int age)
    {
    	//标记是否找到
    	bool bFind = false;
    
    	Student* p = &m_head;
    	while(p)
    	{
    		if (p->age == age)
    		{
    			bFind = true;
    			printNode(p);
    		}
    		p = p->pNext;
    	}
    	if (!bFind)
    	{
    		printf("没有找到该age的节点");
    	}
    }
    void DataObj::printNode(Student* pNode)
    {
    	printf("name = %s, age = %d
    ", pNode->name, pNode->age);
    }
    
    int main()
    {
    	//构造节点
    	Student* pStu = (Student*) malloc(sizeof(Student));
    	strcpy(pStu->name, "aaaa");
    	pStu->age = 30;
    	pStu->pNext = NULL;
    
    	{
    		DataObj dataObj;
    
    		//添加节点
    		dataObj.add(pStu);
    
    		//查找节点
    		dataObj.find(31);
    	}
    
    	return 1;
    }

    欢迎加群交流:C/C++开发交流

  • 相关阅读:
    R语言基础入门
    调用arcpy包批量进行矢量掩膜提取
    一些js面试高频知识点的总结
    js实现五子棋人机对战源码
    编程题汇总,持续更新
    颜色字符串转换
    根据包名,在指定空间中创建对象
    JavaScript中[]+[] 、[]+{}、{}+[]、{}+{}的结果分析
    CSS命名规范
    谈谈浏览器的兼容性
  • 原文地址:https://www.cnblogs.com/woniu201/p/11694619.html
Copyright © 2020-2023  润新知