首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中进行OOP时,优雅的方式来模拟'this'指针?

在 C 语言中,'this' 指针是一个隐式指向当前对象实例的指针,通常用于访问对象的成员变量和成员函数。在 OOP 中,'this' 指针可以用于模拟类中对象的指针,以便在类中调用成员函数。

一种优雅的方式来模拟 'this' 指针是使用指针的指针,称为 'this_ptr'。在 C++11 及以后的版本中,可以使用 'this_ptr' 变量来获取当前对象的指针,并通过指针的指针来调用对象的方法。例如:

代码语言:c++
复制
class MyClass {
public:
    void myMethod() {
        // 调用当前对象的成员函数
        this_ptr->myMethod();
    }
};

在这个例子中,'this_ptr' 是一个指向当前对象指针的指针,可以使用它来调用当前对象的成员函数。这种模拟 'this' 指针的方式在 C++ 中非常常见,并且对于编写面向对象的代码来说非常有用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用 Kotlin 函数式编程 替代 GOF 设计模式用 Kotlin 函数式编程 替代 GOF 设计模式函数式编程(FP)《Kotlin极简教程》正式上架:

例如:函数无法作为普通数据那样传递(OOP函数指针约束),所以OOP中有各种各样、五花八门设计模式。...绝大部分设计模式实现都离不开多态性思想。换一种说法就是,这些设计模式背后本质其实就是OOP多态性,而OOP多态本质上又是受约束函数指针。...简单说,就是一句话:允许将子类类型指针赋值给父类类型指针。而我们OOP那么多设计模式,其实就是OOP多态性约束规则下,对这些函数指针调用模式总结。...这个以函数为参数概念,跟C语言中函数指针类似。...返回值是true被过滤出来。 有了高阶函数,我们可以用优雅方式进行模块化编程。 另外,高阶函数满足结合律: ?

1.2K50

HotSpot类模型之InstanceKlass「建议收藏」

除了保存类元信息外,此类还有另外一个重要功能,即支持方法分派,主要是通过Java虚函数表和Java接口函数表完成,不过C++并不像Java一样,保存信息非要在类定义出相关属性,C++只是分配内存为要存储信息分配好特定内存...GC垃圾回收,遍历某个对象所引用其它对象,会结合此信息进行查找; 接口实现类,只有当前类表示一个接口存在。...正常情况下,HotSpot使用Klass表示Java类,用oop表示Java对象,而Java对象可能定义静态或非静态字段,非静态字段值存储oop,而静态字段值存储表示当前Java类java.lang.Class...java.lang.Class对象是通过对应Oop对象保存类静态属性,因此他们实例大小不同,需要特殊方式计算他们大小以及属性遍历。...创建,会涉及到C++对new运算符重载,通过重载new运算符分配对象内存空间,然后再调用类构造函数初始化相应属性。

1K30
  • 真的可以,用C语言实现面向对象编程OOP

    C_OOP 贯彻了这一思想,C中有一种复杂数据结构叫做struct。struct是C里面的结构体。 如上图假如我们要对鸟bird进行封装,bird可能包括姓名、颜色、栖息地、重量、属性等信息。...green p.addr = 'w'; p.weight = 175; p.other = 1; 继承 常见用C语言实现继承机制,多半是用结构体组合实现,同样利用struct,我们创建一个...一个核心就是多态,C对于多态实现可以借助函数指针实现。...从大学到工作至今,嵌入式领域中一直是使用C语言,而我在学习C++过程,看代码越多,代码量越大,越来越觉得C++对于大型软件架构良好可控性,和对以后程序员维护代码良好可读性; 个人认为:C语言中最大成功在于它指针...OOP程序,通常是通过类定义和接口定义实现

    4.4K31

    深入解析Java对象和类HotSpot VM内部具体实现

    对象与类 HotSpot VM使用oop描述对象,使用klass描述类,这种方式被称为对象类二分模型。理解对象类二分模型最好方法是回归到编程语言本身来看。...oop全称是Ordinary Object Pointer,它来源于Smalltalk和Self语言,字面意思是“普通对象指针”,HotSpotVM中表示受托管对象指针。...“受托管”是指该指针能被虚拟机各组件跟踪,如GC组件可以发现对象不再使用时回收其内存,或者可以发现对象年龄过大,将对象移动到另一个内存分区等。总地来说,对象是由对象头和字段数据组成。...使用VM参数-XX:+UseCompressedOops还可以开启对象指针压缩,64位机器上开启该参数后,可以用32位无符号整数值(narrowOop)表示oop指针。...调用虚方法虚拟机会在运行时常量池中查找n静态类型Nodeprint方法,获取它在Node虚表index,接着用index定位动态类型AddNode虚表虚方法进行调用。

    72740

    C 语言实现面向对象第一步--对象模型

    C++、Java 而言,OOP 意思是利用类层级(class hierarchies)及虚函数进行编程。...也可以考虑使用普通类(plain class)(也就是常说 C With Class)、泛型编程和独立函数(就像数学、C,以及 Fortran 那样)作为解决问题方案。 当然,OOP !...一种很直白简单方式,就是使用函数指针表示成员方法和数据放在一个struct 内。 比如在搜狗开源服务端框架 Workflow 中就大量使用了这种方式: ?...delete则回收资源,主要是调用类析构函数 + 释放内存。 new()方法必须知道当前正在创建是什么类型对象, C++ ,编译器会自动识别,并生成对应汇编。...但是 C 我们只能手动将类型相关信息作为参数。 然后 new 方法内使用一系列 if 去分别处理每种类型?

    1K10

    React Native for Android源码分析 一《JNI智能指针之介绍篇》

    JNI指针 ---- 通常app, JNI提供native函数主要充当Java类扩展,逻辑层Java端,JNI端较少使用OOP设计思想。...JNI指针 ---- 通常app, JNI提供native函数主要充当Java类扩展,逻辑层Java端,JNI端较少使用OOP设计思想。...由上可见,JNI智能指针第一个需求,就是要自动管理jobject生命周期,当进入与离开对应作用域,需要自动调用对应生命周期创建与销毁函数。这在C++,通常会结合构造与析构函数来进行配对调用。...若功能仅限于此,就与普通智能指针和mutext锁管理机制类似了,更重要需求是C++层提供与被管理Java对象镜像结构C++对象,形成高层次封装。...这样,对jobject访问与操作就会被封装在对应镜像C++对象,相关JNI反射调用细节被隐藏,对于其他native模块而言,与Java层交互被转化成了与这些镜像C++对象交互,整个实现风格OOP

    1.2K50

    实战案例分享:根据 JVM crash 日志定位和分析问题

    GC 参数 JVMGC控制参数,有一个GC前进行校验参数,在校验过程当发生地址异常化会打印出异常地址,并且让JVM crash,因为这个参数每一次GC都要检查,包括新生代GC,影响一定性能...UI界面,用过HSDB工具,可以发现当我们启动命令控制台时候,实际上HSDB是把CLHSDB嵌入了HSDB图形界面里,那我们可以使用CLHSDB通过命令行方式进行dump分析。...(*p); } oop和narrowOop情况下是不一样获取地址方式 3....指针压缩 继续分析下去之前,我们先要介绍oop, narrowOop背景 JVM 1.6后面为了节省heap堆内存会使用压缩指针地址设计,因为对象结构里指向别的对象是指针引用oop,这个地址是保存在...Heap,保存Bit 64地址太浪费Heap空间,所以JVM里保存了一个以heap基地址为基本地址,计算对象真实地址和基本地址差值并且通过位移(shift)节省空间,该指针定义为narrow_oop

    2.4K21

    【Go 基础篇】走进Go语言面向对象编程世界

    OOP概述 面向对象编程是一种程序设计范式,它以对象为中心,将数据和操作封装在一起。面向对象世界,万物皆对象,每个对象都有自己状态(属性)和行为(方法)。...对比传统OOP语言 与传统面向对象编程语言(如Java、C++)相比,Go语言面向对象方面有一些独特之处。例如,Go语言中没有类概念,而是通过结构体和接口实现对象和多态性。...此外,Go语言封装是基于命名约定,而不是依赖于访问修饰符。 尽管有这些差异,Go语言仍然提供了一种清晰而简洁方式进行面向对象编程,通过结构体、方法和接口构建灵活且可维护代码。...最佳实践:简洁而强大 使用Go语言进行面向对象编程,有一些最佳实践可以帮助我们写出更加简洁而强大代码。 选择组合而不是继承:Go语言鼓励使用组合构建复杂对象,而不是继承。...通过结构体、方法、封装、组合和接口,我们可以Go实现OOP思想,构建出高效、可维护和可扩展程序。无论你是新手还是有经验开发者,掌握Go语言中OOP概念和技巧,都将使你代码更加优雅和强大!

    28120

    Go语言入门

    Go是google 09年推出编程语言,Go语言专门针对多处理器系统应用程序编程进行了优化,使用Go编译程序可以媲美CC++代码速度,而且更加安全、支持并行进程。...Go语言摘得了TIOBE公布2009年年度大奖。该奖项授予2009年市场份额增长最多编程语言,可谓一风光无限。最新一期go语言排在44位,并不是很高,长期霸占语言排行榜头名是java,c。...许式伟总结go语言主要八个特点: 惊喜1:大道至简 • 基础哲学:继承自C 大道至简。 显式表达 任何封装都是有漏洞。 最佳表达方式就是最直白表达方式。 不试图去做任何包装。...惊喜4:极度简化但完备OOP • 废弃大量 OOP 特性 – 如:继承、构造/析构函数、虚函数、函数重载、 默认参数等。...• 简化符号访问权限控制 • 取消隐藏 this 指针 – 改为显式定义 receiver 对象。 • OOP编程核心价值原来如此简单 – 只是多数人都无法看透。

    1.1K50

    《Kotin 极简教程》第8章 函数式编程(FP)(1)第8章 函数式编程(FP)《Kotlin极简教程》正式上架:

    例如:函数无法作为普通数据那样传递(OOP函数指针约束),所以OOP中有各种各样、五花八门设计模式。...绝大部分设计模式实现都离不开多态性思想。换一种说法就是,这些设计模式背后本质其实就是OOP多态性,而OOP多态本质上又是受约束函数指针。...简单说,就是一句话:允许将子类类型指针赋值给父类类型指针。而我们OOP那么多设计模式,其实就是OOP多态性约束规则下,对这些函数指针调用模式总结。...返回值是true被过滤出来。 有了高阶函数,我们可以用优雅方式进行模块化编程。 另外,高阶函数满足结合律: ?...惰性计算,表达式不是绑定到变量立即计算,而是求值程序需要产生表达式进行计算。

    1.4K20

    【Java】 JVM 如何保存 Java 对象

    前言 本文主要讲解一下 JVM 如何保存 Java 对象以及 Java 对象指针压缩相关东西。...下图是对象保存一种方式,也是 Hotspot 虚拟机采用方式,对象只保存实例数据,同时会有一个指针指向方法区一个方法表(和 c++ Virtual method table 类似)...Ordinary Object Pointer (OOP) JVM Java 对象使用 OOP(Ordinary Object Pointer) 表示,格式如下图所示。...Compressed OOPs 我们使用压缩 OOP 实现在64位 JVM 上使用32位大小引用来寻址,这个方式主要是基于 Java 对象是 8 字节对齐,即后三位全部为 0,也就是在当前对象引用后三位实际上是没有用到...开启了压缩之后,堆 OOP下列字段会被压缩: 每个对象 Kclass 字段(Mark不会压缩) 指向其他 OOP 引用 OOP 数组每个元素 下面是 Integer 对象不同情况下占内存大小

    1.1K10

    JVM | OOP-Klass 二分模型

    小刀微信名换成了凑心, 头像换成了上面为武汉加油,不要不认识了,,,,, 本文知识点 OOP和klass概念 OOP和Klass源码 HSDB使用 OOP和klass概念 OOPS: 即普通对象指针...,用来描述对象实例信息 Klass: Java类C++对等体,用来描述Java类 总体上是多个OOP和一个Klass是对应....: 表示对象头 Klass 对应是: instanceKlass : 虚拟机层面描述一个java类 OOP源码 首先看oopsHierarchy.hpp文件,可以看到OpenJDK源码中都是用...虚拟机内部,通过instanceOop 表示一个java对象,对象在内存布局可以分为连续两部分, instanceOopDesc 和实例数据 其中 instanceOopDesc中有: friend...,如类名称 Klass主要字段 如上图所示,有类名称, 父类, 子类,类加载器等信息,即使没有C++语言基础,看到这些名字也能猜出来大致意思 instanceKlass 原有klass基础之上多了注解

    91830

    如何使用Go语言写出面向对象风格代码

    在上一篇文章:小白也能看懂context包详解:从入门到精通 分析context源码,我们看到了一种编程方法,结构体里内嵌匿名接口,这种写法对于大多数初学Go语言朋友看起来是懵逼,其实在结构体里内嵌匿名接口...、匿名结构体都是面向对象编程中继承和重写一种实现方式,之前写过java、python对面向对象编程继承和重写应该很熟悉,但是转Go语言后写出代码都是面向过程式代码,所以本文就一起分析一下如何在...因为Go语言特性问题,构造器只能够依靠我们手动实现。 这里方法实现是依赖于结构体值接收者、指针接收者特性实现。...Go语言中实现封装我们可以采用两种方式: Go语言支持包级别的封装,小写字母开头名称只能在该包内程序可见,所以我们如果不想暴露一些方法,可以通过这种方式私有包内容,这个理解比较简单,就不举例子了...内嵌匿名接口类型:将接口类型嵌入到结构体,该结构体默认实现了该接口所有方法,该结构体也可以对这些方法进行重写,这种方式可以支持参数多态,这里要注意一个点是如果嵌入类型没有实现所有接口方法,会引起编译未被发现运行错误

    35220

    使用HSDB查看类变量内存布局(5)

    Oop for java/lang/Integer @ 0x00000000ff62ea10 b: 12 c: 13 d: 'B' 使用了指针压缩,如果不想使用指针压缩,可以使用如下jdb命令: jdb...-XX:+UseSerialGC -Xmx10m -XX:-UseCompressedOops 另外还可以使用图形化方式查看内存布局。...不进行指针压缩,使用如下命令: jdb -XX:+UseSerialGC -Xmx10m -XX:-UseCompressedOops 使用univers、scanoops与inspector命令查看对象内存布局...Oop for java/lang/Integer @ 0x00007f0ae463d5c8 b: 12 c: 13 d: 'B' 使用图形化方式查看内存布局,如下图所示。...查看类中所定义各个字段偏移量,如下图所示。 除了使用HotSpot虚拟机命令、HSDB外,还可以使用JOL等查看字段内存布局,使用比较简单,这里不在介绍。

    81740

    C++航海王:追寻罗杰编程之路】string类

    1.1 -> C语言中字符串 C语言中,字符串是以‘\0’结尾一些字符集合,为了操作方便,C标准库中提供了一些str系列库函数,但是这些库函数与字符串时分离开,不太符合OOP思想,而且底层空间需要用户自己管理...使用OOP好处: 易维护 质量高 效率高 易扩展 并且OJ,有关字符串题目基本以string类形式出现,而且常规工作,为了简单、方便、快捷,基本都使用string类,很少有人去使用C...从字符串pos位置开始往后找字符c,返回该字符字符串位置 rfind 从字符串pos位置开始往前找字符c,返回该字符字符串位置 substr str从pos位置开始,截取n个字符,然后将其返回...注意:下述结构是32位平台下进行,32位平台下指针占4个字节。...写拷贝就是一种拖延症,实在浅拷贝基础之上增加了引用计数方式实现

    10210

    编程语言思维方式

    为了模拟这种精髓,我转换为Golang时候也想办法去实现了所谓继承和多态。但是这样一我就犯了一个错误,就是用Java思想来写Golang。...刚学Java时候,也有人告诉我OOP代码千万不要去用面向过程思维来写,一定要继承和多态。 那么为什么我用Golang还是要用Java思维来写呢?...甚至说着陕西话陕西人和说着河南话河南人之间思维方式都有不少差异。 编程语言也是如此,我开发了好多年Java以后,难免会带着Java思维去写Golang。...这段代码按照我现在对Golang理解来说还有点难以理解。但是不妨碍我了解这门语言特色和思维方式。 代码我可以解释地方已经用注释标注了。...在我看来,既然Golang并发如此容易实现,那么为什么不尽可能多使用并发呢?也只有掌握了一种语言思维方式之后,才能写出优雅代码。

    1.5K60

    HotSpot源码分析之C++对象内存布局

    HotSpot采用了OOP-Klass模型描述Java类和对象。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象具体类型。...1、C++类对象内存布局 我们使用Visual Studio工具查看C++对象内存布局,所以需要在当前项目上右键单击选择“属性”后,打开属性页,配置属性->C/C++->命令行下其它选项文本框配置如下命令...HotSpot,经常需要计算类本身需要占用内在大小,只要通过sizeof计算即可。...根据注释描述,HotSopt设计者不想让每个对象中都含有一个vtable(虚函数表),所以就把对象模型拆成klass和oop,其中oop不含有任何虚函数,而klass就含有虚函数表,可以进行方法分发...而C++实现动态分派主要就是通过虚函数来完成,非虚函数在编译就已经确定调用目标。C++虚函数通过关键字virtual声明,如上函数func()没有virtual关键字,所以是非虚函数。

    54920

    如何设计优雅类结构

    在前面的章节详细讨论了命名、方法和数据结构等等这些概念,它们能够帮助我们更好地理解代码行或者代码块级别里如何写出简洁优雅。在此基础上,我们还是要在更高层面上去探究代码简洁之道。...紧接着是公共方法 一些私有的方法应该紧接着它被调用共有方法后边 封装 OOP很多概念都是相通,封装作为OOP一个基本概念突出了「开闭原则」重要性,它很好地解决了一些扩展性问题,它使得接口提供者可以屏蔽此接口具体实现...一个类职责应该是唯一,这才符合OOP对现实世界模拟概念。...我倒是觉得尽管实际编程工作不得不不断地进行妥协,但是只要把clean code理念放在心中,并用它审视自己代码,我们总是会写出越来越好代码。编程是如此,人生何尝不是如此。...每次发生改变,都可能对我们现有系统造成威胁,那么我们设计系统「类组织结构」就要尽可能降低这种风险。 然后在这个小节作者举了个使用abstract类解决对类修改问题。

    1.1K60

    Yet Another OOP : 基于原型而非基于类

    举个例子,钥匙开锁,这里钥匙和锁类型理论上都能影响到开锁流程,但是c++绑定代码只会看一个类型。...基于原型系统构造对象有两种方法,通过复制(clone)已有的对象,或者通过扩展空对象创建。很多框架例如Vue都会通过扩展空对象方式自己重写一套原型链。...例如,JavaScript,默认顶级对象是Object,它自身具备一些通用属性和方法,被原型链上所有对象继承。对象也可以重写继承属性(实际上,就相当于对象内部有个指针指向原型对象)。...对象结构是动态。 修改b原型a,影响了b属性 这个实现有些类似于之前提到委托(delegation),通过引用原型对象方式进行复用。...某些语言例如wikiKevo,则是通过副本方式,直接拷贝原型所有属性,修改原型对象不会影响到当前对象,同时也不需要遍历整个链查找属性。

    35030
    领券