析构函数:构造与析构是相反的过程
析构函数的调用:https://www.bilibili.com/video/BV1jJ411279W/?spm_id_from=trigger_reload
#include "stdfx.h"
//函数是在栈上面的,栈上的局部对象调用时机
//构造:声明该对象是构造
//析构:对象出作用域时
//全局对象的调用时机
//在main之前构造
//在main之后析构
//析构函数:
//1.作用:完成资源的反初始化,资源的释放,避免内存泄露
//2.析构函数的写法:
// 1)类名前~
// 2)通常由编译器决定调用时机,不需要手动
// 3)析构函数没有参数以及返回值
//3.析构函数不能重载
//通常情况下,构造析构变为公有
class CStudent() {
public:
//构造函数
CStudent() {
//为了m_szName创建一个堆空间(分配动态内存)
m_szName = (char*)malloc(255);
//free(m_szName);
};
//析构函数
~CStudnet() {
printf("");
};
CStudent(char* pName,int nLength){
//为了m_szName创建一个堆空间(分配动态内存)
if(nLength >255){
return;
}
m_szName = (char*)malloc(255);
if(m_szName == nullptr){
return;
}
memcpy(m_szName,pName,nLength);
};
void SetName(char* pszName){
strcpy_s(m_szName,pszName);
}
privatre:
int m_nStuID;
char* m_szName;//名字 char m_szName[255]
};
CSstudent g_stu; //全局对象
int main()
{
CStudnet stu("张三",strlen("张三")+1);
//拷贝构造函数:
//1.作用:本质上也是一种构造函数
//2.调用机制 当用一个对象给创建另外一个对象,赋值时调用
//3.缺省的拷贝构造函数的作用(完全把对象1拷贝到对象2 memcpy)
CStudnet stu2 = stu;
//stu.~CStudnet(); //一般情况不需要手动调用
return 0;
}
拷贝构造函数注意事项:
浅拷贝和深拷贝
浅拷贝:默认的拷贝构造函数(使用的内存相同)
深拷贝:仅把内容赋值给B
何时需要从写拷贝构造函数:
若对象中的成员函数存在一种需要分配的资源时,为了避免在析构时重复释放,需要从写拷贝构造函数或禁用。