如何在动态初始化类以及对象所占存储空间的释放&memset函数的使用&参数初始化表如何使用?

目录

 

构造函数使用之如何根据输入变量的长度动态申请内存空间?

内存空间的动态申请new与动态释放delete的搭配使用

在下列三种情况下,析构函数被自动执行

Memset函数怎么用?它是干啥用的?

如何使用参数初始化表?


构造函数使用之如何根据输入变量的长度动态申请内存空间?

如下示例:

#include <iostream>  
using namespace std;  
#include<string>  
  
class Cstudent  
{  
private:  
    int mark;  
    char *name;  
public:  
    Cstudent(int mark, char *name) // 类类型内只能由一个析构函数但可以有多个构造函数  
    {  
        int i = sizeof(name);  
        this->name = new char[i];  
        memset(name, 0, i + 1); // 该函数直接对内存进行赋值操作,对于含有大量元素的数组来说极为有用  
        strcpy(this->name, name);  
  
        this->mark = mark; // this指针代表本对象的地址,this->成员变量代表对象的成员变量与函数的形参区分开来  
    }  
    ~Cstudent(); // 切记:析构函数只能有一个,它只在对象被释放的时候被调用,用来在对象被删除之前向外界传递消息  
};  
  
Cstudent::~Cstudent()  
{  
    if (name) // 如果成员变量name指针不为空  
    {  
        delete[] name; // 自动判断动态申请内存大小并且释放  
    }  
    cout << "析构函数被调用,对象被释放" << endl;  
}  
  
int main()  
{  
    char name[] = "超级无敌霸霸强";  
    Cstudent student(89, name);  
}

 

 

内存空间的动态申请new与动态释放delete的搭配使用

这里就涉及到一个问题:在哪里用new动态申请,在哪里用delete动态释放:

这里就引出了“构造函数”&“析构函数”:构造函数中我们可以动态申请变量,在析构函数中我们可以动态释放内存,他们两个就像一堆不可分割的兄弟,一个负责节目开始的筹备工作,一个负责节目的收尾工作,但是要注意的是析构函数是去执行内存释放前的收尾工作,并不是去操控内存删除对象,同理,构造函数不是去声明定义类对象而是在定义对象后去初始化类对象。

如下所示:

#include <iostream>  
using namespace std;  
#include<string>  
  
class Cstudent  
{  
private:  
    int mark;  
    char *name;  
public:  
    Cstudent(int mark, char *name) // 类类型内只能由一个析构函数但可以有多个构造函数  — 筹备工作show time
    {  
        int i = sizeof(name);  
        this->name = new char[i];  
        memset(name, 0, i + 1); // 该函数直接对内存进行赋值操作,对于含有大量元素的数组来说极为有用  
        strcpy(this->name, name);  
  
        this->mark = mark; // this指针代表本对象的地址,this->成员变量代表对象的成员变量与函数的形参区分开来  
    }  
    ~Cstudent(); // 切记:析构函数只能有一个,它只在对象被释放的时候被调用,用来在对象被删除之前向外界传递消息  
};  
  
Cstudent::~Cstudent()  // 收尾工作show time
{  
    if (name) // 如果成员变量name指针不为空  
    {  
        delete[] name; // 自动判断动态申请内存大小并且释放  
    }  
    cout << "析构函数被调用,对象被释放" << endl;  
}  
  
int main()  
{  
    char name[] = "超级无敌霸霸强";  
    Cstudent student(89, name);  
}

 

在下列三种情况下,析构函数被自动执行

以下几种情况会自动调用析构函数:

①、如果在一个函数中定义了一个局部对象,那么当这个函数执行结束时也就是该类对象生命周期结束的时候,所以类的析构函数会被自动调用;

②、被声明成全局类类型或者static类类型的对象,他们的生命周期一般是在程序退出的时候,这时候该对象的析构函数才会被调用;

③、如果是用new操作符动态的动态创建了一个类对象,只有当用delete进行释放该对象的时候,析构函数才会被调用。

总之,就是类对象的声明周期结束之时,就是析构函数调用之时。

Memset函数怎么用?它是干啥用的?

每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:

# include <string.h>  
void *memset(void *s, int c, unsigned long n); 

 

函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

如下示例:

# include <stdio.h>  
# include <string.h>  
int main(void)  
{  
    int i;  //循环变量  
    char str[10];  
    char *p = str;  
    memset(str, 0, sizeof(str));  //只能写sizeof(str), 不能写sizeof(p)  
}  
// 结果:把str字符型数组初始化为{0,0,0,0,0,0,0,0,0,0}  

 

如何使用参数初始化表?

使用方式如下所示:

class CStudent //  类类型声明原型  
{  
private:  
    int mark;  
    string name;  
    float height;  
public:  
    CStudent(int Dmark, string Dname, float Dheight) :mark(Dmark), name(Dname), height(Dheight)  
    {} // 千万不要忘记大括号,即使里面为空也要写上  
    ~CStudent(){}  
}; 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值