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;
}

运行结果:

调用了构造函数!!!
调用了构造函数!!!
调用了构造函数!!!
调用了构造函数!!!
调用了构造函数!!!
------------------------
调用了析构函数!!!
调用了析构函数!!!
调用了析构函数!!!
调用了析构函数!!!
调用了析构函数!!!