zoukankan      html  css  js  c++  java
  • 【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++开发交流

  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/woniu201/p/11694619.html
Copyright © 2011-2022 走看看