C++中对象指针【详细讲解】
对象指针和普通变量指针相同,对象指针指向类所实例化的对象,并且可以通过对象指针操作这个对象。【对象指针指向对象】
1、new和malloc的区别【他们申请的空间都在堆区】
new和malloc的区别 |
---|
1)malloc和free是C++/C语言的标准函数#include<stdio.h>;new/delete是C++的关键字 |
2)malloc/free和new/delete都可以动态申请内存和释放内存。new/delete比malloc/free更加智能,其底层也是执行malloc/free。智能是因为new和delete会在创建对象时自动执行构造函数,对象消除时会自动执行析构函数。 |
3)new返回指定类型的指针,并且可以自动计算出所需的大小。malloc必须由用户指定大小,并且默认返回类型为void*,必须进行强制类型转化。 |
2、程序实例
区别2)的验证
#include <stdio.h>
#include <iostream>
using namespace std;
class Person {
public:
Person() :Age(10)
{
cout << "调用构造函数!!!" << endl;
}
~Person()
{
cout << "调用析构函数!!!" << endl;
}
int Age;
};
int main()
{
Person* p = (Person*)malloc(sizeof(Person)); //使用malloc定义对象指针,不会调用构造函数
free(p); //使用delete来释放对象指针,不会调用析构函数
//malloc需要指定返回值类型;需要指定申请空间的大小
return 0;
}
运行结果:
没有运行结果
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class Person {
public:
Person() :Age(10)
{
cout << "调用构造函数!!!" << endl;
}
~Person()
{
cout << "调用析构函数!!!" << endl;
}
int Age;
};
int main()
{
Person* p = new Person; //使用new来创建一个对象指针,会调用构造函数
delete p; //使用delete来销毁一个对象指针,会调用析构函数
//new会返回指定类型的指针,不需要进行指定;也不需要指定申请空间的大小
return 0;
}
运行结果:
调用构造函数!!!
调用析构函数!!!
3、new执行过程
使用new关键字在堆上创建一个对象时,做了三个主要事情:
1)申请一块内存空间;
2)调用构造函数进行初始化;
3)返回指定类型的指针,创建失败返回NULL。
4、new格式
格式:数据类型 指针 = new 数据类型(初值)/[大小]
举例:Person *p = new Person; //Person是一个类
int *p = new int(10); //申请一个存放int类型数据的空间,并且将该空间的值初始化为10,返回一个指向该空间的地址
char *p = new char[10]; //申请一个char类型的数组空间,并且该空间存放10个字符型数据,返回申请的第一个字符的空间的地址
注意:new对数组进行分配空间时,不能指定数组的初始值。如果无法实现数组空间的申请,则new只会返回一个NULL空指针。
程序:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class Person {
public:
//构造函数1
Person()
{
cout << "调用Person()构造函数!!!" << endl;
}
//构造函数2
Person(int age)
{
Age = age;
cout << "调用Person(int age)构造函数!!!" << endl;
}
//析构函数
~Person()
{
cout << "调用了析构函数!!!" << endl;
}
int Age;
};
int main()
{
Person* p = new Person; //调用构造函数1
Person* q = new Person(10); //调用构造函数2
cout << "q->Age的值为:" << q->Age << endl;
int* pt = new int(20);
cout << "*pt的值为:" << *pt << endl;
delete p; //调用析构函数
delete q; //调用析构函数
delete pt;
return 0;
}
运行结果:
调用Person()构造函数!!!
调用Person(int age)构造函数!!!
q->Age的值为:10
*pt的值为:20
调用了析构函数!!!
调用了析构函数!!!
5、delete使用【尤其注意对于申请的数组空间的释放格式】
格式:delete 指针名称;
delete []指针名称; //用于释放申请的数组空间
程序:
#include <iostream>
#include <string>
using namespace std;
class Person{
public:
Person()
{
cout << "调用了构造函数!!!" << endl;
}
~Person()
{
cout << "调用了析构函数!!!" << endl;
}
};
int main()
{
Person* pbuff = new Person[5]; //申请5个对象的空间,将该空间的第一个地址传给pbuff指针
cout << "------------------------" << endl;
delete[]pbuff; //通过delete进行释放申请的空间
return 0;
}
运行结果:
调用了构造函数!!!
调用了构造函数!!!
调用了构造函数!!!
调用了构造函数!!!
调用了构造函数!!!
------------------------
调用了析构函数!!!
调用了析构函数!!!
调用了析构函数!!!
调用了析构函数!!!
调用了析构函数!!!