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

运行结果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
指向类的成员的指针C++,可以说明指向类的数据成员和成员函数的指针。 指向数据成员的指针格式如下: ::* 指向成员函数的指针格式如下: (::*)() 例如,设有如下一个类A: class A { public: int fun (int b) { return a*c+b; } A(int i) { a=i; } int c; private: int a; }; 定义一个指向类A的数据成员c的指针pc,其格式如下: int A:: *pc = &A::c; 再定义一个指向类A的成员函数fun的指针pfun,其格式如下: int (A:: *pfun)(int) = A::fun; 由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定A类的一个对象,然后,通过对象来引用指针所指向的成员。例如,给pc指针所指向的数据成员c赋值8,可以表示如下: A a; a.*pc = 8; 其,运算符.*是用来对指向类成员的指针来操作该类的对象的。 如果使用指向对象指针来对指向类成员的指针进行操作时,使用运算符->*。例如: A *p = &a; //a是类A的一个对象,p是指向对象a的指针。 p ->* pc = 8; 让我们再看看指向一般函数的指针的定义格式: *() 关于给指向函数的指针赋值的格式如下: = 关于在程序,使用指向函数的指针调用函数的格式如下: (*)() 如果是指向类的成员函数的指针还应加上相应的对象名和对象成员运算符。 下面给出一个使用指向类成员指针的例子: #include class A { public: A(int i) { a=i; } int fun(int b) { return a*c+b; } int c; private: int a; }; void main() { A x(8); //定义类A的一个对象x int A::*pc; //定义一个指向类数据成员的指针pc pc=&A::c; //给指针pc赋值 x.*pc=3; //用指针方式给类成员c赋值为3 int (A::*pfun)(int); //定义一个指向类成员函数的指针pfun pfun=A::fun; //给指针pfun赋值 A *p=&x; //定义一个对象指针p,并赋初值为x cout<*pfun)(5)<<endl; //用对象指针调用指向类成员函数指针pfun指向的函数 } 以上程序定义了好几个指针,虽然它们都是指针,但是所指向的对象是不同的。p是指向类的对象;pc是指向类的数据成员;pfun是指向类的成员函数。因此它们的值也是不相同的。 对象指针对象引用作函数的参数 1. 对象指针作函数的参数 使用对象指针作为函数参数要经使用对象作函数参数更普遍一些。因为使用对象指针作函数参数有如下两点好处: (1) 实现传址调用。可在被调用函数改变调用函数的参数对象的值,实现函数之间的信息传递。 (2) 使用对象指针实参仅将对象的地址值传给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时空开销。 当形参是指向对象指针时,调用函数的对应实参应该是某个对象的地址值,一般使用&后加对象名。下面举一例子说明对象指针作函数参数。 #include class M { public: M() { x=y=0; } M(int i, int j) { x=i; y=j; } void copy(M *m); void setxy(int i, int j) { x=i; y=j; } void print() {

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值