嵌入式学习记录6.5(内存分配/构造函数/析构函数)

目录

目录

一.c++动态内存分配回收

1.1分配

1.2回收

[1.3new、delete和malloc、free之间的区别(重点)](#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 int5;

//在堆区空间连续申请了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示例

cpp 复制代码
#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示例

cpp 复制代码
#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,设计这两个类的构造函数、析构函数。

cpp 复制代码
#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(height),weight(weight){
        cout<<"1有参构造"<<endl;
    }
    ~Per(){
        cout<<"Per析构函数"<<endl;
    }
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;
}
相关推荐
丰锋ff9 分钟前
基于 Qt 的智慧社区物业管理系统学习过程
学习
小贺儿开发11 分钟前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
其实防守也摸鱼22 分钟前
Codex破局:前端组件秒级生成的技术文章大纲
开发语言·前端·人工智能·学习·安全·web安全
YM52e1 小时前
鸿蒙ArkTS项目实战 - 门店陈列巡检台:完整代码与运行效果
学习·华为·harmonyos
️学习的小王1 小时前
NumPy完整学习笔记:ndarray数组详解、创建、索引切片、常用函数与运算
笔记·学习·numpy
老当益壮梁奶奶2 小时前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
sunoo-2292 小时前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习
蒸蒸yyyyzwd2 小时前
cpp选手秋招学习笔记 day12
笔记·学习·oracle
GeekPlusA3 小时前
ai-opendesign学习
学习
XiaQ09193 小时前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习