目录
目录
一.c++动态内存分配回收
1.1分配
1.2回收
1.3new、delete和malloc、free之间的区别(重点)
二.构造函数
2.1功能,格式
2.2示例
三.析构函数
3.1功能,格式
3.2特点
3.3示例
四.思维导图/练习
4.1思维导图
4.2练习
一.c++动态内存分配回收
1.1分配
1.单个分配
格式:数据类型 *指针名 = new 数据类型
eg: int *p1 = new int;
//在堆区申请了int类型的大小空间,并将该空间的地址赋值给p1
2 连续分配
格式:数据类型 *指针名 = new 数据类型[个数]
eg: int *p2 = new int[5];
//在堆区空间连续申请了5int大小的空间
1.2回收
1. 单个回收
格式: delete 指针名
eg: delete p1;
2 连续回收
格式:delelte []指针名
delete []p2;
1.3new、delete和malloc、free之间的区别(重点)
1> new、delete是关键字,而malloc和free是函数。
2> new申请空间时,可以初始化。而malloc不可以。
3> new申请空间以数据类型为单位,而malloc是以字节为单位。
4> 指针是什么数据类型,new就是申请什么数据类型。而malloc申请空间的返回值是void*,使用是需要强转。
5> new申请空间delete释放空间,区分格式。而malloc和free不区分。
6> new申请类对象空间时,会自动调用构造函数,而malloc不会自动调用。
7> delete释放类对象空间时,会自动调用析构函数,而free不会自动调用。
二.构造函数
2.1功能,格式
1.当实例化一个对象时,给类对象申请空间和初始化使用的。
2.类名(参数列表) { 函数体内容 }
3.调用时机
1> 栈区
何时实例化对象,何时自动调用构造函数
2> 堆区
何时使用new申请类对象空间 , 何时自动调用构造函数
2.2示例
#include <iostream>
using namespace std;
class Dog
{
private:
string color;
int age;
string name;
public:
// 无参构造
Dog()
{
cout << "Dog::无参构造函数" << endl;
}
//有参构造函数
Dog(string color, int age, string name):color(color),age(age),name(name)
{
cout << "Dog::有参构造函数" << endl;
}
void show()
{
cout << "颜色:" << color << " 年纪:" << age << " 品种:" << name << endl;
}
};
int main()
{
Dog d1;
Dog d2("red", 1000, "二哈");
d2.show();
return 0;
}
三.析构函数
3.1功能,格式
1.功能:当类对象生命周期结束时,自动调用析构函数,来给类对象回收资源(释放空间)。
2.格式 函数名:~类名 返回值:无,也无void 参数:无访问权限:一般为public
~类名() { 函数体内容; }
3.调用时机
1> 栈区
当类对象所在的函数结束时,自动调用析构函数来释放空间。
2> 堆区
何时使用delete释放类对象,何时自动调用析构函数
3.2特点
1> 系统会提供一个默认的析构函数,当程序员手动定义析构函数时,系统会取消默认提供。
2> 当类中有指针成员,并且申请堆区空间时,此时需要显性定义出析构函数,在析构函数中手动释放指针成员申请的空间,否则会造成内存泄漏。
3> 每个类中只能有一个析构
函数(原因:无参)
3.3示例
#include <iostream>
using namespace std;
class Stu{
private:
string name;
int age;
public:
Stu(string name,int age):name(name),age(age){
}
void show(){
cout<<name<<" "<<age<<endl;
}
~Stu(){
cout<<"析构函数"<<endl;
cout<<this<<endl;
}
};
int main()
{
Stu stu1("zhangsan",18);
Stu stu2("zhang",8);
return 0;
}
四.思维导图/练习
4.1思维导图
4.2练习
设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数。
#include <iostream>
//设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、
//体重,再设计一个Stu类,类中包含私有成员:
//成绩、Per类对象p1,设计这两个类的构造函数、析构函数。
using namespace std;
class Per{
public:
Per(){
cout<<"无参构造"<<endl;
}
void show(){
cout<<name<<" "<<age<<" "<<height<<" "<<weight<<endl;
}
Per(string name,int age,double height,double weight):name(name),age(age),height(new double(height)),weight(new double(weight)){
cout<<"有参构造"<<endl;
}
~Per(){
delete height;
delete weight;
};
private:
string name;
int age;
double *height;
double *weight;
};
class Stu{
private:
double score;
Per p1;
public:
Stu(double score,string name,int age, double height,double weight):score(score),p1(name,age,height,weight){
cout<<"2有参构造"<<endl;
}
Stu(){
cout<<"无参构造"<<endl;
}
~Stu(){
cout<<"Stu析构函数"<<endl;
}
void show(){
cout<<score<<endl;
}
};
int main()
{
Per per2("zz",18,100,90);
per2.show();
Stu stu1(100,"zy",19,100,90);
stu1.show();
return 0;
}