文章目录
- 一、析构函数
- 二、C++默认生成的函数
- 三、构造与析构的调用顺序
- 四、构造函数的浅拷贝
- 五、构造函数的深拷贝
一、析构函数
1、析构函数的作用
对象消亡时,自动被调用,用来释放对象占用的内存空间。
2、属性特点
(1)名字与类名相同
(2)在前面需要加上"~"
(3)无参数,无返回值(也不能加void)
(4)一个类最多只有一个析构函数
(5)不自定义析构函数C++会生成默认析构函数
二、C++默认生成的函数
在默认情况下,定义一个C++类都会默认生成以下三个函数:
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝构造函数(对类中非静态成员进行简单值拷贝)
注意:
若自定义了拷贝构造函数,将不再提供任何构造函数。
若自定义了普通构造函数,将不会提供默认构造函数,但还是会提供默认拷贝构造函数。
三、构造与析构的调用顺序
构造函数是先定义的先调用,而析构函数是先定义的后调用,类似于“栈”存储结构。
class Test
{
int id;
public:
Test(int i)
{
id = i;
}
~Test()
{
cout<<"ID: "<<id<<" 已析构对象内存空间"<<endl;
};
};
Test t0(0);
void Func()
{
static Test t1(1);
Test t2(2);
cout<<"-----Func-----"<<endl;
}
int main()
{
Test t3(3);
t3 = 10;
cout<<"------主函数开始-------"<<endl;
{
Test t4(4);
}
Func();
cout<<"------主函数结束-------"<<endl;
return 0;
}
四、构造函数的浅拷贝
就是构造函数只进行简单的值拷贝。
#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
class Person
{
private:
char *m_name;
int m_num;
public:
Person()
{
m_name = NULL;
m_num = 0;
cout << "已调用无参构造..." << endl;
}
Person(char *name,int num)
{
m_name = (char *)calloc(1,strlen(name)+1);
if(m_name == NULL)
{
cout<<"构造失败"<<endl;
}
cout<<"-->已经申请好空间"<<endl;
strcpy(m_name,name);
m_num = num;
cout<<"已调用有参构造..."<<endl;
}
~Person()
{
if(m_name != NULL)
{
cout<<"m_name的空间已被释放"<<endl;
free(m_name);
m_name = NULL;
}
cout<<"析构函数调用结束..."<<endl;
}
void showPerson()
{
cout << "m_name = " << m_name << ", m_num = " << m_num << endl;
}
};
void demo1()
{
Person p1("Chung", 42607);
p1.showPerson();
Person p2= p1;
}
void demo2()
{
Person p3;
p3.showPerson();
Person p4= p3;
}
int main(int argc, char *argv[])
{
demo2();
return 0;
}
(1)测试demo1
(2)测试demo2
只调用到一半就出错结束了。
五、构造函数的深拷贝
就是通过自定义,拷贝构造函数,完成深拷贝动作,能够将数值和地址都拷贝进去。
#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
class Person
{
private:
char *m_name;
int m_num;
public:
Person()
{
m_name = NULL;
m_num = 0;
cout << "已调用无参构造..." << endl;
}
Person(char *name,int num)
{
m_name = (char *)calloc(1,strlen(name)+1);
if(m_name == NULL)
{
cout<<"构造失败"<<endl;
}
cout<<"-->已经申请好空间"<<endl;
strcpy(m_name,name);
m_num = num;
cout<<"已调用有参构造..."<<endl;
}
Person(const Person &p)
{
cout << "--------------------拷贝构造函数----------------------" << endl;
m_name= (char *)calloc(1, strlen(p.m_name)+1);
cout << "空间已被申请" << endl;
strcpy(m_name, p.m_name);
m_num= p.m_num;
cout << "--------------------拷贝构造函数----------------------" << endl;
}
~Person()
{
if(m_name != NULL)
{
cout<<"m_name的空间已被释放"<<endl;
free(m_name);
m_name = NULL;
}
cout<<"析构函数调用结束..."<<endl;
}
void showPerson()
{
cout << "m_name = " << m_name << ", m_num = " << m_num << endl;
}
};
void demo1()
{
Person p1("Chung", 42607);
p1.showPerson();
Person p2= p1;
}
void demo2()
{
Person p3;
Person p4= p3;
p4.showPerson();
}
int main(int argc, char *argv[])
{
demo1();
return 0;
}
(1)测试demo1
(2)测试demo2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)