#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person()
{
cout<<"Person默认构造函数调用"<<endl;
}
Person(string iname):name(iname)
{
cout<<"Person有参构造函数调用"<<endl;
}
~Person()
{
cout<<"Person析构函数调用"<<endl;
}
string name;
};
void test01()
{
/*
Person *p = new Person等价于以下3行代码:
Person *p = (Person*) malloc(Person);
if(NULL==p){return;}
p->Person();//调用无参构造函数。
*/
Person *p = new Person;// 调用无参构造函数。注意:须确保无参构造函数存在。
Person *p2 = new Person("Lisi"); // 调用有参构造进行初始化。
cout<<p2->name<<endl;
delete p; // 调用析构函数。
delete p2; // 调用析构函数。
/*
malloc和new的区别:
1、new关键字和delete关键字是C++中的运算符,malloc和free是C标准库提供的库函数;
2、new是以具体类型为单位进行内存分配,malloc是以字节单位进行内存分配;
3、new在申请单个类型变量时可进行初始化,malloc不具备内存初始化特性;
4、malloc申请的内存空间类型是void*,须进行强转,new申请的内存空间是对应类型,
无须做强制转换。
注意事项:
1、不要用void*接收new构造出来的对象,利用void*无法调用析构函数。
*/
}
// 利用new开辟数组
void test02()
{
// int* p_int = new int[5]; // 在堆区开辟了可以存放5个int型数的内存空间。
// double *p_double = new double[10];
// 在堆区开辟数组,一定会调用类的默认构造函数,因此须确保默认构造函数存在。
Person *p_person = new Person[2];
delete[] p_person;// 释放数组时,须在delete关键字后加上[]。
// 在栈区开辟数组,可以没有默认构造函数。
Person p_arr[3] = {Person("1"), Person("2"), Person("3")};
}
/*
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新开辟空间,进行拷贝操作
若属性有在堆区开辟的,须提供
1、拷贝构造函数(为堆区属性开辟空间,以防止浅拷贝带来的问题);
2、赋值运算符重载函数(为堆区属性开辟空间,以防止浅拷贝带来的问题);
3、析构函数(用于释放堆区属性内存).
*/
int main()
{
//test01();
test02();
return 0;
}