构造函数、析构函数和拷贝构造函数是C++类中的三种特殊成员函数,它们分别用于对象的初始化、清理和拷贝操作。
1.构造函数(Constructor):构造函数在对象创建时自动调用,用于初始化对象的成员变量。它的名称与类名相同,没有返回类型。构造函数可以重载,即同一个类可以有多个构造函数,根据参数的不同进行选择。
class RolePlayer {
public:
//构造函数
RolePlayer(){
std::cout << "构造函数" << std::endl;
};
};
在main函数中实例化多个对象
int main() {
RolePlayer roleA;
RolePlayer roleB;
RolePlayer roleC;
system("pause");
retrun 0;
}
运行,查看结果;
构造函数在对象创建时自动调用,一般我们会在构造函数中针对对象的成员变量进行初始化,这个时候就可以对构造函数进行重载
,设置带参数的构造函数;
重载(Overloading)是指在一个类中定义多个同名方法,但是它们的参数列表不同,即参数类型、参数个数或者参数顺序不同。在调用这些方法时,编译器会根据传入的参数类型和数量来确定具体调用哪个方法。这种特性可以增加代码的灵活性和可读性。
示例:
class RolePlayer {
public:
//构造函数
RolePlayer(){
std::cout << "构造函数" << std::endl;
};
//带参数的构造函数
RolePlayer(int HP){
m_nHP = HP;
};
//获取HP的方法
int GetHP() {
return m_nHP;
}
private:
char * m_NPCName;
int m_nHP;
};
在对象创建时运行带参数的构造函数对对象的m_nHP成员变量进行赋值;
int main() {
RolePlayer roleA(44);
std::cout << roleA.GetHP() << std::endl;
system("pause");
return 0;
}
此时对象roleA成员变量在实例化的时候就已经被赋值了。
2.析构函数
析构函数在对象销毁时自动调用,用于释放对象占用的资源,比如内存、文件句柄等。它的名称是在类名前面加上波浪号(~),没有参数和返回类型。通常用于清理对象分配的资源,确保没有资源泄漏。
还是使用RolePlayer类进行示范
class RolePlayer {
public:
//构造函数
RolePlayer(){
std::cout << "构造函数" << std::endl;
};
//析构函数
~RolePlayer(){
std::cout << "析构函数" << std::endl;
};
};
这个时候我们在源文件中使用new创建一个对象,并替对象创建地址空间,接着使用delete释放掉对象的地址空间;
int main() {
RolePlayer * pRoleA = new RolePlayer;
delete pRoleA;
system("pause");
return 0;
}
接着运行程序:
可以看到对象的构造函数在创建对象时执行,析构对象在释放对象时执行。
析构函数可以清理对象分配的资源,确保没有资源泄漏。
3.拷贝构造函数(Copy Constructor):拷贝构造函数用于在创建新对象时,以已存在的对象作为参数进行初始化。它通常用于对象的复制或传递。如果不显式定义拷贝构造函数,编译器会提供默认的拷贝构造函数,执行浅复制。
我们还是拿RolePlayer类进行举例
class RolePlayer {
public:
//一个传入参数的构造函数
RolePlayer(int HP){
m_nHP = HP;
};
//拷贝构造函数
RolePlayer(const RolePlayer & other){
m_nHP = other.m_nHP;
std::cout << "拷贝构造函数执行成功" << std::endl;
}
//获取对象HP
int GetHP() {
return m_nHP;
}
private:
int m_nHP;
};
此时我先实例化一个对象roleA,接着再创建一个对象roleB,且再创建对象B的时候调用拷贝构造函数进行对象的复制与传递;
int main() {
//实例化对象roleA
RolePlayer roleA(44);
//实例化对象roleB
RolePlayer roleB(roleA);
std::cout << roleB.GetHP() << std::endl;
system("pause");
return 0;
}
此时我在创建roleA对象时调用其构造函数进行成员初始化,将roleA对象的m_nHP值设置为44,接着实例化对象roleB,且调用拷贝构造函数,将对象A作为拷贝对象进行传入;此时再打印roleB的HP值,结果如下:
可以看到拷贝构造函数执行成功,且roleA对象的属性成功拷贝至roleB。