class A
{
public:
A(){}//构造函数
~A(){};//析构函数
};
构造函数
创建类的实例的时候,会自动调用构造函数。
如果没有自己实现构造函数,则系统会自动生成一个默认的构造函数。如果已经实现了,那么默认的构造函数会失效。
构造函数可以重载。
函数名和类名一致。
函数没有返回值。
析构函数
类生命周期结束后,用来清理类里的资源的函数。
如果没有显式地去定义的话,编译器会自动生成一个,不做任何事。
如果显式定义,则编译器不会自动生成。
析构函数以~开头,函数的名字和类名一致,没有参数。没有返回值。
拷贝构造函数
当发生类的实例之间赋值时,会出现两个类之间的成员拷贝。
这种拷贝在某些情况下是没问题的,但是如果成员变量是指针,且在构造函数里动态分配内存,在析构函数里释放,就会出问题。
#include <iostream>
#include <cstring>
using namespace std;
class Automate{
private:
double p;
char *name;
public:
//只读成员变量只能用初始化列表的方式初始化
Automate(double _p):p(_p),//将price变量初始化为_price
{
name=new char[20];
}
void show(void)
{
cout<<p<<endl;
}
//析构函数
~Automate(void)
{
if(name)
{
delete name;
name=NULL;
}
cout<<"类在此被析构"<<endl;
}
//自己的拷贝构造函数
Automate(const Automate &automate)
{
name=new char[20]; //自己申请自己的空间
strcpy(name,automate.name);
p=automate.p;
}
};
int main(void)
{
Automate automate(2.5);//第一个实例
Automate automat2=automate; //让第二个实例等于第一个实例
//发生了类之间的拷贝,也就是等价于下面:
/*
automat2.price=automate.price;
automat2.name=automate.name;
automat2.balance=automate.balance;
*/
automat2.show();
Automate automate3(automat2);
automate3.show();
Automate *p=new Automate(automate3);
p->show();
}