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;
此句意为 定义一个名为animal
的Animal类
的对象实例
类指针
定义类对象的基本格式是:Animal animal = new Animal
类对象在定义*animal
的时候并未分配内存,只有在执行new
之后才会手动分配一段Animal
类的动态内存,且将其地址绑定了一个名为animal
的Animal
类指针,且为堆内存(手动分配的动态内存都存放在堆内存中)
Animal* animal = new Animal;
此句意为动态分配一个Anima
l类大小的空间(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
函数
例如 : Animal
是Dog
的基类
Animal* dog= new Dog;
此时类指针dog调用的Func函数便是分配给他空间的Dog类中的Func函数 (Func需是虚函数才会调用成功)
什么情况使用类对象与类指针?
其实作用基本一样 都是为了调用类的成员变量和成员函数用的
类对象:希望明确使用这个类的时候,使用类对象
类指针:希望使用C++中的动态绑定,使用类指针或引用
类指针的好处
第一 : 实现多态
第二 : 在函数调用传入类对象时,如果传入的是类对象的指针参数,此时不管你的对象或结构参数多么庞大,你用指针,传过去的就是4个字节,如果用固定的类对象示例进行传递参数,参数 传递占用的资源就太大了
源自 虚函数项目
参考c++中的类与类指针🔍