知识点1【new delete】
new:申请空间,调用构造函数
delete:调用析构函数,释放空间
先来个类
class Person
{
private:
char m_name[32];
int m_num;
public:
Person()
{
cout<<"无参构造"<<endl;
}
Person(char *name,int num)
{
cout<<"有参构造"<<endl;
strcpy(m_name,name);
m_num=num;
cout << m_name<<endl;
cout <<m_num<<endl;
}
~Person()
{
cout<<"析构"<<endl;
}
void showPerson()
{
cout <<"名字:"<<m_name<<",年龄:"<<m_num<<endl;
}
};
1、new 申请 基本类型数组空间
void test01()
{
//char *arr = new char[32]{"hello"};//不可以
char *arr = new char[32];
strcpy(arr,"hello");
cout <<arr <<endl;
delete [] arr;
}
运行结果
2、new delete 给类对象申请空间
void test01()
{
Person *p = new Person;//无参构造被屏蔽;解决方法:1、人为申请一个无参构造
Person *p1 = new Person("lucy",100);//有参调用
//p->showPerson();
p1->showPerson();
//先调用析构函数,再释放堆区空间。
delete p;
}
运行结果:
3、对象数组:本质是数组 只是数组的每个元素是类的对象
a、基础的静态数组
对象数组arr是数组,每个元素是Person类型的对象
定义对象数组的时候,系统会自动给数组中每个元素调用构造函数
自动调用无参构造
void test02()
{
Person arr[5];
}
运行结果:
b、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。
// 对象数组arr1是数组,每个元素是Person类型的对象
//定义对象数组的时候,系统会自动给数组中每个元素调用构造函数
//人为调用有参构造
//初始化部分,调用有参构造,未初始化部分调用无参构造
void test03()
{
Person arr[5]={Person("lucy",18),Person("bob",20)};
arr[0].showPerson();
arr[1].showPerson();
}
运行结果:
c、用new,delete申请对象数组
void test04()
{
//第一种方式
Person *arr =NULL;
arr = new Person[5];
//第二种方式
Person *arr1 = new Person[5]{Person("lucy",10)};
(*(arr1+0)).showPerson();
arr1[0].showPerson();
delete [] arr;
delete [] arr1;
}
尽量不要用delete释放void *,释放会出现问题:
void test05()
{
Person *p = new Person("lucy",18);
p->showPerson();
void *p1 = p;
delete p1;
}
运行结果:
没有析构的原因:delete 发现p1指向的类型为void,无法从void中寻找相应的构造,析构函数。可是选择delete p1;系统不知道该释放的空间大小。