point类型·

指针的类型

不同类型的指针,从内存需求的观点来说,没有什么不同!他们三个都需要足够的内存来繁殖一个机器地址,“指向不同类型之各指针”之间的差异,既不在其指针表示法不同,也不再其内容(代表一个地址)不同,而是在其所寻址出来的对象类型不同。也就是说,“指针类型”会导致编译器如何解释某个特定地址中的内存内容及其大小

1、  一个指向地址1000的整数地址,在32位机器上,将涵盖地址空间1000~1003

2、  那么,一个指向地址1000而类型为void*的指针,将涵盖怎样的地址空间呢?这个不知道,这就是为什么一个类型为void*的指针只能够含有一个地址,而不能通过它操作所指之对象的缘故。

其实转型是一种编译器指令,大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式。

Class ZooAnimal{

Public:

ZooAnimal();

Virtual~ZooAnimal();

Virtualvoid rotate();

Protected:

Intloc;

Stringname;

};

Class bear:public ZooAnimal

{

Public:

Bear();

~Bear()

Voidrotate();

Viratul void dance();

Protected:

Int cell_block;

};

但是考虑多态以后呢?加入Bear继承了ZooAnimal  同时是Public继承

Bear b;

ZooAnimal *pz = &b;

Bear* pb = &b;

他们每个都指向Bear对象的第一个字节,其间的差别是,pb所涵盖的地址包含整个Bear对象,而pz所涵盖的地址只包含Bear对象中的ZooAnimal子对象

除了在ZooAnimal中出现的成员,你不能够实用pz来直接处理Bear的任何成员。唯一例外的是通过virtual机制。

Pz->cell_block;

//不正确,cell_block不是ZooAnimal的一个成员,虽然我们知道pz当前指向一个Bear对象

((Bear*)pz)->cell_block;

//合法 经过一个明白的转型操作就没有问题

Pb->cell_block;

//合法  因为cell_block是Bear的一个成员

但是当我们写

Pz->rotate();时,(rotate是虚拟函数)pz的类型将在编译使其决定一下两点:

固定的可用接口,也就是说,pz只能够调用ZooAnimal的Public接口

该接口的访问级别(例如rotate()是ZooAnimal的一个public成员)

在每一个执行点,pz所指的对象类型可以决定rotate()所调用的实体,类型信息的封装并不是维护与pz之中,而是维护与link之中,此Link存在于对象的vptr和vptr所指的virtual table之间,在每一个virtual table中都有一个信息是type of info的信息

Bear b;

ZooAnimal za = b; //这样会引起切割

Za.rotate();  //调用ZooAnimal::rotate()

为什么rotate()所调用的是ZooAnimal实体而不是Bear实体?为什么za的vptr不指向Bear的virtual table

编译器在初始化以及赋值操作(将一个对象赋值给另一个对象)之间做了仲裁,编译器必须确保如果某个对象含有一个或一个以上的vptrs,那么vptrs的内容不会被基类对象初始化或改变

加入ZooAnimal->Bear->Panda  继承关系

ZooAnimal za;

ZooAnimal * pza;

Bear b;

Panda* pp = new Panda;

Pza = *b

将za或b的地址,或pp所含的内容(也是个地址)指定给pza,显然不是问题,一个指针或一个引用值所以支持多态,是因为它们并不引发内存中任何“与类型有关的内存委托操作”,会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已。

所谓与类型有关的内存委托操作是指这个类型被编译所认识的大小,比如上面使用pz->cell_block.

大小和内容解释方式是在编译期间发生的,但是对于多态来说,是一个函数,但是函数是不依附于对象的,如果只要访问的对象中存在这个函数并且这个函数的访问级别可以达到,编译期间就可以实现,但是等到运行期间,如果发现这个函数是一个虚函数,这个时候在虚函数表中的第一个位置就是关于这个类型的所有信息,这个时候就会知道这个对象对应的真实类型是什么。需要分清这两点的差异

时间: 2024-11-05 10:21:43

point类型·的相关文章

菜鸟学python之对象类型及运算

Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型. 等号(=)用来给变量赋值. 1 变量赋值 1.1 单个变量赋值 >>> name="python" >>> print(name) python 1.2 多个变量赋值 >>> name=names="python&

JavaScript的进阶之路(三)引用类型之Object类型和Array类型

引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var obj1= new Object(); console.log(obj1); obj1.name="吴琼"; obj1.age=28; console.log(obj1.name+" "+obj1.age); //对象字面量语法 ,有点封装的感觉 var obj2 = {

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

主键类型定义错了调试了半天

package com.itheima.demo1; import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table; @Entity@Table(name="u_user")public class User

js判断浏览器类型

js判断浏览器类型  <script type="text/javascript" >     <!--   function getOs()   {       var OsObject = "";      if(isIE = navigator.userAgent.indexOf("MSIE")!=-1) {           return "MSIE";      }      if(isFiref

Python的动态类型

动态类型:                                                      在python中,类型是在运行过程中自动决定的,而不是通过代码声明的. 变量:                                                                                     变量是一个系统表的元素,拥有指向对象的连接的空间 python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的. 变量的使用

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

译:SOS_SCHEDULER_YIELD类型等待在虚拟机环境中的增多

原文出处:Increased SOS_SCHEDULER_YIELD waits on virtual machines 注: 原文的用词是Increased,想译作增强(增长),或者加强,这么译起来是褒义词,而原文要表达的Increased并没有褒义的含义,最起码是一个中性的含义,想来想起用一个“滋长”偏编译的含义还是比较合适的,感觉还是有点过于贬义了,还是用最通俗的增多吧.个人英语水平有限,另外就是对于文中提到的“rdtsc周期”也不是非常清楚,翻译的也不是很清楚,权当是自娱自乐.总是原文的

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?