先看一段代码:
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;
此句意为动态分配一个Animal类大小的空间(new Animal)给一个指向Animal的类对象指针(Animal* animal)
(也就是动态分配出一片大小为sizeof(Animal)字节大小的内存空间,且将这段内存空间的起始地址(首地址)赋值给类型为Animal类对象指针animal)
关于C++的关键字兼运算符: new和delete
new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上 。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是, new的使用格式,new指令申请出来的是一段空间的首地址 。所以一般需要用指针来存放这段地址
类对象和类指针的区别
定义不同
类对象:
利用类的构造函数(构造函数,对类进行初始化工作的函数)在内存中分配一块区域(包括成员变量的赋值部分)
类指针:
是一个内存地址值 (动态分配出的类指针地址)是一个内存地址值,指向内存中存放的类对象(包括成员变量赋值部分)
类指针可以指向多个不同的对象,这就是C++的多态
使用方式不同
引用成员:
对象使用.操作符 而类指针使用->操作符
生命周期:
类对象:若是类中的成员变量数据, 则需要由类的析构函数来进行空间的释放,若是类的成员函数中的临时变量,则作用域生命周期在函数体内
类指针:需要利用delete在相应的地方对分配的内存块进行释放
存储位置不同
类对象:存储位置在栈内存中,是局部的临时变量
类指针:存储位置在堆内存中,是永久变量,除非使用delete进行手动释放和计算机重启,否则一直存在(未进行释放则容易造成内存泄漏)
多态
类指针可以实现多态,直接用对象不行
访问方式
类指针:
指针变量是间接访问,但可实现多态(通过父类指针可以调用子类对象),并且没有调用构造函数
类对象:
直接声明可直接访问,但不能 实现多态,声明时即调用了构造函数(已自动分配了内存)
类对象与类指针联系
在类的声明尚未完成的情况下,可以声明指向该类的指针,但不可声明该类的对象
类指针与多态
由前面可知:类指针是一个指向内存中存放类对象的内存地址 的值(也就是知道了所有类对象的地址),那么这个指针可以指向多个不同的对象,这就是多态
类指针与虚函数
要发挥虚函数的强大作用,必须使用指针来访问对象
比如当类是有虚函数的基类时,Func是类的一个虚函数,则调用Func时:
类对象:调用的是他本类中自己的Func函数
类指针:调用的是分配给他空间时的那个类的Func函数
例如 : Animal是Dog的基类
Animal* dog= new Dog;
此时类指针dog调用的Func函数便是分配给他空间的Dog类中的Func函数 (Func需是虚函数才会调用成功)
什么情况使用类对象与类指针?
其实作用基本一样 都是为了调用类的成员变量和成员函数用的
类对象:希望明确使用这个类的时候,使用类对象
类指针:希望使用C++中的动态绑定,使用类指针或引用
类指针的好处
第一 : 实现多态
第二 : 在函数调用传入类对象时,如果传入的是类对象的指针参数,此时不管你的对象或结构参数多么庞大,你用指针,传过去的就是4个字节,如果用固定的类对象示例进行传递参数,参数 传递占用的资源就太大了
源自 虚函数项目
参考c++中的类与类指针🔍
本文介绍了C++中类对象与类指针的区别,包括它们的定义、生命周期、存储位置和多态性。类对象在栈内存中分配,而类指针在堆内存中动态分配并实现多态。类指针通过虚函数实现多态调用,适合用于动态绑定。使用类对象或指针主要取决于是否需要多态性和资源管理的需求。

4881

被折叠的 条评论
为什么被折叠?



