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().