当前位置: 首页 > news >正文

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++中的类与类指针🔍

相关文章:

  • 第六天 if if…else 三木运算符
  • C++ 虚函数与多态性
  • pb11.2build8949 数据窗口dw limit有关问题
  • VS 监视功能
  • C++ 抽象类
  • C++ 运算符重载
  • 购买Microsoft Technet订阅,免费获得微软几乎所有的产品序列号“用于评估”,...
  • C++ 操作符重载
  • 客户端调用webservice的两种方式
  • C++ 多继承
  • redmine 主题thems-默认主题
  • C++ 虚继承
  • C++ 错误处理和调试(编写代码前的准备工作)
  • 将整型数字转换为大写汉字的自定义函数,如转换为'壹贰
  • C++ assert函数与捕获异常
  • [nginx文档翻译系列] 控制nginx
  • [译]CSS 居中(Center)方法大合集
  • 【mysql】环境安装、服务启动、密码设置
  • CentOS 7 防火墙操作
  • centos安装java运行环境jdk+tomcat
  • C语言笔记(第一章:C语言编程)
  • HTML5新特性总结
  • HTTP中的ETag在移动客户端的应用
  • js操作时间(持续更新)
  • Otto开发初探——微服务依赖管理新利器
  • python大佬养成计划----difflib模块
  • webpack4 一点通
  • 动态规划入门(以爬楼梯为例)
  • 基于 Babel 的 npm 包最小化设置
  • 力扣(LeetCode)965
  • 巧用 TypeScript (一)
  • 入门到放弃node系列之Hello Word篇
  • 入手阿里云新服务器的部署NODE
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Mac 上flink的安装与启动
  • $GOPATH/go.mod exists but should not goland
  • (14)Hive调优——合并小文件
  • (42)STM32——LCD显示屏实验笔记
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)fread与fwrite详解
  • (c语言)strcpy函数用法
  • (WSI分类)WSI分类文献小综述 2024
  • (定时器/计数器)中断系统(详解与使用)
  • (二十四)Flask之flask-session组件
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .Family_物联网
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net IE10 _doPostBack 未定义