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

指向类数据成员的指针

在C++中,可以定义一个指针,使其指向类成员或成员函数,然后通过指针 来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。它类似与static成员函数或成员变量,具有共享的属性。...每一个实例化的对象都可以借助指向类数据成员的指针来访问指向的数据。...*pf)(); (ps3->*pf)(); getchar(); return 0; } 以上均是指向非静态成员的类成员指针,而指向静态类成员的指针则非常简单。...●指向类静态成员函数的指针 指向静态成员函数的指针和普通指针相同,在定义时无须和类相关联,在使用时也 无须和具体的对象相关联。...int *p = & Student::data; cout<<*p<<endl; // 指向类静态数据成员函数的指针 void (*pfunc)() = Student::display; pfunc

17810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++系列之二 指向成员函数的指针(烧脑)

    ,原文详细解释了C++中指向成员函数的指针,因为带有“教程”一词,所以比较通俗易懂。...这个例子证明了成员函数指针不是常规指针。另外,为什么C++如此费心地去发明这样的语法?很简单,因为它和常规指针是不同的东西,而且这样的类型转换也是违反直觉的。...C++类型转换规则 非虚函数情形 我们在前面一节看到,成员函数指针并不是常规指针,所以,成员函数指针(非静态)不能被转换成常规指针(当然,如果哪个脑残真想这么做的话,可以使用汇编技术来暴力解决),因为成员函数指针代表了...但是,如果是成员函数指针之间相互转换呢?...成员函数指针和常规指针的对比 不同情形下的成员函数指针转换规则 如何使用成员函数指针数组来解决特定的设计问题 编译器是如何解释成员函数调用的 扩展:成员变量指针 http://luodw.cc/2015

    3.1K20

    C++ this指针:用于在成员函数中指向调用该函数的对象

    C++中this指针是一个指向当前对象的指针。在成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。...一、定义和使用this指针 this指针是在成员函数内部定义的一个常量指针。它存储了当前对象的地址,可以通过它访问当前对象的成员变量和成员函数。...二、作为返回值的this指针 this指针可以作为返回值返回。这种情况下,返回的是指向调用该函数的对象的指针。为了实现这个功能,需要将返回类型设置为类的引用或指针类型。...person.setName("Tom").setName("Jerry"); std::cout << person.getName() << std::endl; // 输出Jerry 在setName函数内部,返回的是指向调用该函数的对象的指针...这里使用了*this来访问调用该函数的对象。 三、作为函数参数的this指针 this指针也可以作为函数参数传递。这种情况下,可以在函数内部访问其他对象的成员变量和成员函数。

    26140

    C++智能指针详解(共享指针,唯一指针,自动指针)

    前言:智能指针在C++11中引入,分为三类: shared_ptr:共享指针 unique_ptr:唯一指针 auto_ptr:自动指针 一、共享指针 几个共享指针可以指向同一个对象; 每当shared_ptr...+的指针算法 唯一指针不可使用赋值语法进行初始化,应使用普通指针初始化 唯一指针可以为空 release()可以让唯一指针返回其拥有的对象,并失去指向该对象的唯一性,调用release()的指针将指向返回的对象...return uq; //将uq关联对象的所有权转移给调用函数 } uq = source(); 要将新值赋给唯一指针,该新值必须是唯一指针 函数可以作为数据的接收端,也可以作为数据发送源 return...传递的删除器类型的实例作为删除器,创建一个空的唯一指针 unique_ptr up(ptr) 使用默认/传递的删除器类型的实例作为删除器,创建拥有* ptr的唯一指针 unique_ptr...up(ptr,del) 使用del作为删除器创建拥有* ptr的唯一指针 unique_ptr up(move(up2)) 创建一个拥有up2先前拥有的指针的唯一指针(此后up2为空) unique_ptr

    1.7K20

    c++那些事儿9.0指针

    1.0在32位的cpu上,cpu一般由32根地址线组成,所以地址大小为32位 即4byte,同理可得指针大小为4byte; 2.0指针是有类型的,和它指向的数据类型相同;...指针的转换. int *p1; double *p2=(double *)p2; 9.0指针函数。//指向指针的函数。...---- 指向对象成员的指针,指向对象成员函数的指针,指向对象数组的指针。 ---- 指向对象的指针的用法与指向其他任何数据类型的指针的语法相同。...所以指向对象数组的指针和指向数组的指针用法一样。 但是指向 类成员的指针就有点不同了,类内部没有地址,选择一个类的成员就是指定这个成员在类中的偏移。...//调用成员函数 (s.*fun)(); //指向对象数组的指针。

    71180

    C++:43---派生类向基类转换、静态动态的类变量

    二、转换的本质 派生类可以转换为基类的本质是: ①为什么派生类可以转换为基类:派生类从基类而来,因此派生类中包含了基类的方法和成员。...此时基类可以通过指针或引用指向派生类(相当于将派生类从基类中继承的那部分方法和成员绑定到基类上了,相当于派生类被截断了),然后基类就可以将派生类假装是一个基类对象来使用(调用其中的成员/方法) ②为什么基类不能转换为派生类...A,且指针也为A,因此调用A的getA()函数 A 20:虽然p2指针指向的类类型为B,但是访问规则只与指针/引用的类类型有关,而与指针/引用指向的类型无关。...此处p2指针的类型为A,因此调用A的getA()函数。又因为b对象使用setA()函数将整个继承体系中的a改为了20,因此打印出来的a为20 ?...,那么调用的时候也取决于左边的类型 转换之后,基类只能通过派生类访问属于自己(基类)的那一部分,而不能访问属于派生类的数据成员(见下面演示案例③) 虚函数的调用是个例外:虚函数的调用是取决于指针或引用所指向的类型

    1.8K10

    C语言-----qsort函数的功能以及模拟实现

    ,小于就返 回负数,相等就会返回0;我们可以直接使用两者的插值作为返回值,这样也满足要求的; (4)比较整数 这个是用qsort函数实现排序,把void*类型的指针转换成为int*类型之后就可以解引用,...利用2个数 的差值作为返回值,int_cmp是指向函数可以比较两个数的大小; (5)比较结构体数据---根据年龄 1.return里面的是结构体成员访问操作符,显示强制类型转换成为结构体类型,再进行解引用...; 2.定义结构体数组,里面含有3个元素,sizeof(s[0])是计算第一个结构体成员的大小; (6)比较结构体数据----根据名字 (1)strcmp是库函数,专门用来比较字符串的大小,他的比较原理就是通过指向第一个字符的指...针的移动,依次进行比较,返回值的原理和qsort相同; (2)sizeof(s)/sizeof(s[0])是计算结构体成员的个数; 3.函数的模拟实现 (1)这个就是借助冒泡排序函数实现qsort的功能...(2)void bubble里面的cmp指向int_cmp函数,这里相当于是回调函数, (3)swap函数就是用来交换的,只是这里不知道数据的类型,这个里面是强制类型转换为 char*类型的数据,因为

    9310

    27.C++- 智能指针

    ,然后将p2对象的类成员指针赋值给p1, 最后修改p2指针地址为NULL   cout<<"p2 ="<<p2.get()<<endl; //打印 : p2=0   //cout...可以发现在调用p1=p2时, 首先会delete p1对象的类成员指针(调用~Test(1)析构函数),然后将p2对象的类成员指针赋值给p1(p1=0x8db1018), 最后修改p2指针地址为NULL...STL中的智能指针shared_ptr(需要C++11支持) 带有引用计数机制,支持多个指针对象指向同一片内存(实现共享) 提供swap()成员函数,用来交换两个相同类型的对象,比如:   shared_ptr..., 判断该指针对象地址是否被其它指针对象引用 提供get()成员函数,用来获取指针对象指向的地址 提供reset()成员函数,将自身指针对象地址设为NULL,并将引用计数-1(当计数为0,会自动去delete....unique()指向30所在的地址,所以打印:1 初探shared_ptr智能指针(以上个Test类为例分析) #include

    865100

    最容易出错的C语言指针

    要搞清一个指针需要搞清指针的四方面的内容:指   针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。   ...指   针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始   化,所以它所指向的内存区是不存在的,或者说是无意义的。   ...指针和指   针进行加减:两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。   ...,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指   向的内存区,指针自身占据的内存。   ...把指针数组名str 当作一个指   针的话,它指向数组的第0 号单元,它的类型是char **,它指向的类型是char *。

    92220

    最容易出错的C语言指针

    要搞清一个指针需要搞清指针的四方面的内容:指   针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。   ...指   针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始   化,所以它所指向的内存区是不存在的,或者说是无意义的。   ...指针和指   针进行加减:两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。   ...,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指   向的内存区,指针自身占据的内存。   ...把指针数组名str 当作一个指   针的话,它指向数组的第0 号单元,它的类型是char **,它指向的类型是char *。

    1.1K40

    解锁C++继承的奥秘:从基础到精妙实践(下)

    六、多继承的指针偏移问题 在C++的多继承中,指针偏移问题是指当使用基类指针指向派生类对象时,由于多继承导致内存布局复杂化,必须调整指针来正确访问派生类对象中的基类部分。...Derived::z = " << z << endl; } }; int main() { Derived d; Base1* b1_ptr = &d; // Base1指针指向...Derived对象 Base2* b2_ptr = &d; // Base2指针指向Derived对象 b1_ptr->show(); // 通过Base1指针访问,正确输出Base1...的数据 b2_ptr->show(); // 通过Base2指针访问,正确输出Base2的数据 return 0; } 解释: Derived类继承了Base1和Base2,因此派生类对象...当我们将基类指针指向派生类对象时,Base1* b1_ptr = &d 这种指针的赋值实际上是一个隐式转换,编译器会自动调整指针偏移,使其指向d对象中的Base1部分。

    6510

    【C++】类型转换 ⑤ ( 常量和非常量之间的类型转换 - 常量类型转换 const_cast | const 左数右指原则 | 代码示例 )

    * 左侧 表示该定义的事 常量指针 ( 指向的内存数据不能修改 ) // 左数右指 : const 在指针左边 数据是常量 , const 在指针右边 指针是常量 // 下面两种情况...但是 , 指针指向的内存中的数据可以修改 int* const e = (int*)malloc(10); 二、常量和非常量 之间的类型转换 - 常量类型转换 const_cast 1、常量类型转换...常量类型转换 const_cast , 将 常量指针 改为 变量指针 , 取消 指针指向的 内存空间 的 只读属性 , char* tmp = const_cast(str) ; 然后可以借助...转换成 变量指针 的 tmp 指针 , 改变指针指向内存中的数据 ; // const char * p 表示修饰的数据是常量 , 数据不可更改 void fun(const char * str)...使用 常量类型转换 const_cast 时 , 开发者必须确保 指针指向 的空间是可以修改的 , 如果不能修改 , 强行修改 , 会带来未知灾难性的后果 ; 如 : 定义了 字符串常量 , 字符串常量

    47210

    Swift系列七 - 汇编分析值类型

    :",Mems.ptr(ofVal: &s1)) print("s1指针指向的内存地址:",Mems.ptr(ofRef: s1)) print("s2指针的内存地址:",Mems.ptr...(ofVal: &s2)) print("s2指针指向的内存地址:",Mems.ptr(ofRef: s2)) } test() /* 输出: s1指针的内存地址: 0x00007ffeefbff478...s1指针指向的内存地址: 0x000000010061fe80 s2指针的内存地址: 0x00007ffeefbff470 s2指针指向的内存地址: 0x000000010061fe80 */...s2.width == 11, s2.height == 22,因为修改的是指针指向的内存地址保存的数据,而s1和s2指向的是同一块内存。 2.2....当堆空间02没有强指针指向时就会被销毁。 三、值类型、引用类型的let 使用let时, 结构体: 结构体整体不能被覆盖; 结构体成员值也不能修改。 引用类型: 指针是不能重新指向新内存的。

    41620

    【剑指卷王】字符串转换成整数(atoi)的模拟实现

    字符串转换成整数(atoi)的模拟实现 题目力扣链接:字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C.../C++ 中的 atoi 函数) 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。...如果两者都不存在,则假定结果为正 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。...字符串的其余部分将被忽略 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。...具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1  返回整数作为最终结果 注意: 本题中的空白字符只包括空格字符 ' '  除前导空格或数字后的其余字符串外

    26620

    实现链表反转

    这个思路的难点在于如何调整指针的指向,我们可以借助3个指针来完成这个操作,如下所示: p1、p3分别是p2指针的上、下一个节点(默认指向null) 如果p2指针指向的节点不为null 获取p2指针指向的下一个节点...,将其保存至p3 如果p3的值为null,则表示链表已经反转完毕,用一个变量存储p2的值 修改p2指针的指向至p1,修改p1的值为p2,修改p2的值为p3 IMG_12BA2C91C60A-1 实现代码...首先,设计一个名为ReverseLinkedList的类: 内部有2个私有变量 pPrev p1指针 pNode p2指针 构造方法接受1个参数:链表头节点 对参数进行校验 初始化p2指针指向为链表头节点...,p1指针的指向为null export class ReverseLinkedList { // p1指针 private pPrev: ListNode | null; // p2指针...修改p2指针的指向至p1,修改p1的值为p2,修改p2的值为p3 p2指针指向null,返回得到的链表头节点 reverseList(): ListNode | null { // 反转后的链表头指针

    40150

    24.C++- 抽象类(存虚函数)、接口、多重继承

    比如图形(Shape)类, 就是一个抽象的概念,因为我们无法计算这个“图形”的面积,所以它的成员函数area()是空的。 而继承它的子类(矩形,圆形,三角形等)就可以去重写area()成员函数....1 当多个不同的父类指针指向同一个多重继承的子类时,可能拥有不同地址 比如: #include using namespace std; class BaseA {...从上图看到,其实pa和pb还是位于d对象地址里,只是指向的位置不同而已.所以在多重继承里,最好不要使用等号直接判断两个指针对象是否相等....()成员函数, 通过equal()成员函数来判断指针是否指向当前对象,使用dynamic_cast强制转换  例如: #include using namespace std;...以p->equal(dynamic_cast(pInt1))为例,我们编译时,编译器就会去检查pInt1所在的地址,然后找到是d对象,通过d对象找到Base父类,从而去修正pInt1指针的地址

    76760

    寻找链表中环的入口节点

    环中有4个节点,那么 将p1指针在链表上向前移动4步 p1、p2指针以相同的速度在链表上向前移动 它们相遇的节点正好是环的入口节点 IMG_66D663B2FE91-1 获取环中节点数量 通过上个章节的分析...p1、p2指针指向判断链表中有环时的相遇节点 p1指针继续向前移动,边移动边计数 p1指针与p2指针再次相遇时,即可得到环中节点数量 IMG_584FEB598A64-1 实现代码 通过上面的分析,我们已经得到了解决问题的思路...这里我们基于上篇文章所创建的类,扩展一个名为findRingEntranceNode的方法,实现寻找链表中环的入口节点函数: 初始化两个指针的指向至链表头部 判断链表中是否有环 移动p1、p2指针:p1...若p1指针走到链表尾部都没有与p2指针相遇,那么链表中就不包含环 链表中有环,则做进一步的处理,获取环的入口节点 取出上一步得到的总数量,向前移动p1指针总数量步 p1指针移动完毕后,重置p2指针的指向...,将其指向链表头部 p1、p2指针以相同的速度向前移动,两者相遇处正好是环的入口节点 声明一个变量用于记录节点总数量 p2指针不动,移动p1指针,每移动一次记录总数量的变量就自增一次 p2、p1相遇时,

    90520

    C++指针与引用的区别

    样 的 限 制: string *ps; // 未 初 始 化 的 指 针 // 合 法 但 危 险 3.不 存 在 指 向 空 值 的 引 用 这 个 事 实 意 味 着 使 用...引 用 的 代 码 效 率 比 使 用 指 针 的 要 高,因 为 在 使 用 引 用 之 前 不 需 要 测 试 它 的 合 法 性。...指 针 可 以 被 重 新 赋 值 以 指 向 另 一 个 不 同 的 对象, 但 是 引 用 则 总 是 指 向 在 初 始 化 时 被 指 定 的 对 象 以 后 不 能 改 变。...---- 总 的 来 说 在 以 下 情 况 下 你 应 该 使 用 指 针 : 一 是 你 考 虑 到 存 在 不 指 向 任 何 对 象 的可 能, 在 这 种 情 况 下 你 能 够 设 置 指...针 为 空 ; 二是你 需 要 能 够 在 不 同 的 时 刻 指向 不 同 的 对 象 ,在 这 种 情 况 下 你 能 改 变 指 针 的 指 向。

    68810
    领券