目录
构造函数使用之如何根据输入变量的长度动态申请内存空间?
如下示例:
#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(){}
};