C++充电站(二)——构造函数和析构函数,this指针

1.构造函数

构造函数格式为class_name(),每一个类都有一个或多个构造函数,在生成类时会自动执行构造函数。构造函数的名字跟类名字一样。

#include <iostream>
using namespace std;
 
const short Name = 1;
const short AGE = 2; 
 
class Human
{
  private:
    char name[20];
    unsigned short age;
    char greeting[100];
  public:
    Human(void)
    {
        strcpy(name,"匿名");
        age = 10;
        strcpy(greeting,"你好");
        cout<<"执行无参数构造函数"<<endl;
    }

    Human(char* n,unsigned short a,char* g)
    {
        setinformation(n,a,g);
        cout<<执行含参构造函数"<<endl;
    }

    bool setGreeting(char* g)
    {
        if(g==NULL || strcmp(g,"") == 0 )
        {
            return false;
        }   
        
        else
        {
            strcpy(greeting,g);
            return true;
        }
 
      bool setName(char* n)
      {
        if(n==NULL || strcmp(n,"") == 0 )
        {
            return false;
        }   
        
        else
        {
            strcpy(name,g);
            return true;
        }
      }
     void setage(unsigned short a)
    {
        age = a;
    }
      void MakeGreeting(void)    
    {
        cout<<name<<":"<<greeting<<endl;
    }
 
    void selfIntroduction(short items)
    {
        cout<<"我";
 
        if(items == 0)
        {
            return;
        }
 
        if(items = Name)
        {
            cout<<"叫"<<name<<"。"<<endl;
        }
        
        if(items = AGE)
        {
            cout<<age<<“岁了。”<<endl;
        }
    }
    
    bool setinformation(char* g,char* n,unsigned short a)
    {
        if(!setName(n))
        {
            return false;
        }
        
        setage(a);
        
        if(!setage(g))
        {
            return false;
        }
 
        return true;
    }
};
int main(void)
{
    Human man;
    Human person("大码农",41,"晚上好");
    man.Makegreeting();
    man.selfIntroduction(Name|AGE);
    person.Makegreeting();
    person.selfIntroduction(Name|AGE);
    return 0;
}

构造函数可以重载,即可以有多个构造函数,但是多个构造函数的参数表一定要不同。如果要调用带参构造函数,要在实例名后面加不同的参数表。

PS:执行类同时执行构造函数内容

2.析构函数

析构函数的定义格式为~class_name(),析构函数与构造函数相反,从执行时间上看,构造函数在生成一个类的时候执行,析构函数在销毁一个类的时候执行。在一个函数中调用类后会执行构造函数,但是离开该函数会销毁该类,执行析构函数。一般程序中有动态申请的空间,可以在析构函数中释放内存

#include <iostream>
using namespace std;
 
const short Name = 1;
const short AGE = 2; 
 
class Human
{
  private:
    char name[20];
    unsigned short age;
    char* greeting;
  public:
    Human(void)
    {
        strcpy(name,"匿名");
        age = 10;
        greeting = new char[100];
        strcpy(greeting,"你好");
    }

    Human(char* n,unsigned short a,char* g)
    {
        greeting = new char[100];
        setinformation(n,a,g);
    }

    ~Human()
    {
        delete greeting;
        cout<<"执行析构函数"<<endl;
    }

    bool setGreeting(char* g)
    {
        if(g==NULL || strcmp(g,"") == 0 )
        {
            return false;
        }   
        
        else
        {
            strcpy(greeting,g);
            return true;
        }
 
      bool setName(char* n)
      {
        if(n==NULL || strcmp(n,"") == 0 )
        {
            return false;
        }   
        
        else
        {
            strcpy(name,g);
            return true;
        }
      }
     void setage(unsigned short a)
    {
        age = a;
    }
      void MakeGreeting(void)    
    {
        cout<<name<<":"<<greeting<<endl;
    }
 
    void selfIntroduction(short items)
    {
        cout<<"我";
 
        if(items == 0)
        {
            return;
        }
 
        if(items = Name)
        {
            cout<<"叫"<<name<<"。"<<endl;
        }
        
        if(items = AGE)
        {
            cout<<age<<“岁了。”<<endl;
        }
    }
    
    bool setinformation(char* g,char* n,unsigned short a)
    {
        if(!setName(n))
        {
            return false;
        }
        
        setage(a);
        
        if(!setage(g))
        {
            return false;
        }
 
        return true;
    }
};
int main(void)
{
    Human man;
    Human person("大码农",41,"晚上好");
    man.Makegreeting();
    man.selfIntroduction(Name|AGE);
    person.Makegreeting();
    person.selfIntroduction(Name|AGE);
    Human* pepole;
    pepole = new Human;
    people->Makegreeting();
    people->setName("程序员");
    people->setinformation(NAME);
    return 0;
}

PS:在类外声明类内函数要加::

PS:对于构造函数的复制,可以利用函数名(const 类名& 变量名)的形式

3.this指针

在每一个成员函数中都包含一个特殊指针,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的其实地址。

对于类模版,有例程

#include <iostream>
using namespace std;

template namespace std;

class Compare
{
    private:
        numtype x,y;
    public:
        Compare(numtype a,numtype b)
        {
            x = a;
            y = b;
        }
        
        numtype max()
        {
            return (x>y)?x:y;
        }    
     
       numtype min()
        {
            return (x<y)?x:y;
        }    
}

在类外定义函数,类模版的形式应写成

numtype Compare<numtype>::max().

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值