- 构造函数:
为了用类的时候直接初始化,其名字必须和类的名字一样,在类被用的时候(创建对象),该函数直接被调用,没有返回值。
class X
{
int i;
public:
X(); //构造函数
}
构造函数允许重载,所以在实例化对象的时候,可以根据传入参数的不同选择不同的构造函数,但是只会执行其中的一个,具体执行哪一个,按照传入的参数。具体如下:
#include <iostream>
using namespace std;
class ABC
{
int data;
string name;
public:
ABC(int d, const char *ch) : data(d), name(ch) {}
ABC(ABC &a)
{ //拷贝构造函数
data = a.data;
name = a.name;
}
~ABC() {}
};
int main()
{
ABC b(13, "bob");
ABC a(b);
return 0;
}
如果不在类中显式的定义拷贝构造函数,类也会定义一个默认的拷贝构造函数,完成所有成员的逐个复制。
- 析构函数
在对象结束的时候自动执行,且不能有参数
class X
{
int i;
public:
~X(); //析构函数
}
用拷贝构造函数的时候注意重复释放同一块内存的问题
#include <iostream>
using namespace std;
class F
{
string *str;
public:
F(string *mem) : str(mem) {}
~F()
{
delete str;
}
};
int main()
{
F f1 = new string;
F f2 = f1; //初始化f2调用拷贝构造函数,将f1的一切复制到f2上,也即f2中的str和f1中的str指向同一块内存(指针拷贝了),两次析构时,会重复释放
return 0;
}