C++ 类对象与类指针(静态和动态多态)

本文介绍了C++中类对象与类指针的区别,包括它们的定义、生命周期、存储位置和多态性。类对象在栈内存中分配,而类指针在堆内存中动态分配并实现多态。类指针通过虚函数实现多态调用,适合用于动态绑定。使用类对象或指针主要取决于是否需要多态性和资源管理的需求。

先看一段代码:

class Animal
{
public:
	virtual void eat()
	{
		cout << "我是动物 我在吃东西" << endl;
	}
};

void main()
{
 //建立类对象 animal
Animal animal;
animal.eat();//运行结果为 "我是动物 我在吃东西" 

 //建立类指针 animal
Animal* animal = new Animal;//建立类型为Animal的类对象(new Animal) animal, 指向Animal类的指针(	Animal*)(也就是 基类对象指向基类对象指针)
animal->eat();//运行结果为 "我是动物 我在吃东西" 
}

分析:

类对象
定义类对象的基本格式是: Animal animal类对象在定义之前就已经为animal这个对象分配了内存,且此内存为 栈内存

Animal animal;

此句意为 定义一个名为animalAnimal类的对象实例


类指针
定义类对象的基本格式是:Animal animal = new Animal类对象在定义*animal的时候并未分配内存,只有在执行new之后才会手动分配一段Animal类的动态内存,且将其地址绑定了一个名为animalAnimal类指针,且为堆内存(手动分配的动态内存都存放在堆内存中)

Animal* animal = new Animal;

此句意为动态分配一个Animal类大小的空间(new Animal)给一个指向Animal的类对象指针(Animal* animal)
(也就是动态分配出一片大小为sizeof(Animal)字节大小的内存空间,且将这段内存空间的起始地址(首地址)赋值给类型为Animal类对象指针animal)


关于C++的关键字兼运算符: new和delete
new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上 。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是, new的使用格式,new指令申请出来的是一段空间的首地址 。所以一般需要用指针来存放这段地址

关于new和delete关键字的详细解释🔍


类对象和类指针的区别

定义不同

类对象
利用类的构造函数(构造函数,对类进行初始化工作的函数)在内存中分配一块区域(包括成员变量的赋值部分)

类指针:
是一个内存地址值 (动态分配出的类指针地址)是一个内存地址值,指向内存中存放的类对象(包括成员变量赋值部分)
类指针可以指向多个不同的对象,这就是C++的多态


使用方式不同

引用成员:
对象使用.操作符 而类指针使用->操作符

生命周期:
类对象:若是类中的成员变量数据, 则需要由类的析构函数来进行空间的释放,若是类的成员函数中的临时变量,则作用域生命周期在函数体内
类指针:需要利用delete在相应的地方对分配的内存块进行释放


存储位置不同
类对象:存储位置在栈内存中,是局部的临时变量
类指针:存储位置在堆内存中,是永久变量,除非使用delete进行手动释放和计算机重启,否则一直存在(未进行释放则容易造成内存泄漏)


多态
类指针可以实现多态,直接用对象不行


访问方式

类指针
指针变量是间接访问,但可实现多态(通过父类指针可以调用子类对象),并且没有调用构造函数
类对象:
直接声明可直接访问,但不能 实现多态,声明时即调用了构造函数(已自动分配了内存)


类对象与类指针联系

类的声明尚未完成的情况下,可以声明指向该类的指针,但不可声明该类的对象

详见类的声明部分🚀


类指针与多态

由前面可知:类指针是一个指向内存中存放类对象的内存地址 的值(也就是知道了所有类对象的地址),那么这个指针可以指向多个不同的对象,这就是多态


类指针与虚函数

要发挥虚函数的强大作用,必须使用指针来访问对象
比如当类是有虚函数的基类时,Func是类的一个虚函数,则调用Func时:
类对象:调用的是他本类中自己的Func函数
类指针调用的是分配给他空间时的那个类的Func函数

例如 : AnimalDog的基类

 Animal* dog= new Dog;

此时类指针dog调用的Func函数便是分配给他空间的Dog类中的Func函数 (Func需是虚函数才会调用成功)


什么情况使用类对象与类指针?

其实作用基本一样 都是为了调用类的成员变量和成员函数用的

类对象:希望明确使用这个类的时候,使用类对象
类指针:希望使用C++中的动态绑定,使用类指针或引用


类指针的好处

第一 : 实现多态
第二 : 在函数调用传入类对象时,如果传入的是类对象的指针参数,此时不管你的对象或结构参数多么庞大,你用指针,传过去的就是4个字节,如果用固定的类对象示例进行传递参数,参数 传递占用的资源就太大了

源自 虚函数项目
参考c++中的类与类指针🔍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值