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

每个类的函数在该类的对象中有函数指针吗?

在面向对象编程中,每个类的函数在该类的对象中都有函数指针。函数指针是指向函数的指针变量,它可以存储函数的地址,并且可以通过函数指针调用相应的函数。

在C++中,类的成员函数可以被视为类的一种特殊成员,它们在对象中占据一定的内存空间,并且可以通过对象来调用。实际上,每个类的对象都包含了一个指向该类成员函数的函数指针,这个指针指向类的成员函数的地址。

通过对象调用成员函数时,编译器会隐式地将对象的地址传递给成员函数,并通过函数指针来调用相应的函数。这样可以实现对类的成员函数的动态调用,使得程序具有更高的灵活性和可扩展性。

函数指针的存在使得可以在运行时动态地选择调用不同的成员函数,从而实现多态性。通过函数指针,可以实现类似于虚函数的功能,使得不同的对象可以调用相同的函数名,但执行的具体函数却可能不同。

总结起来,每个类的函数在该类的对象中都有函数指针,通过函数指针可以在运行时动态地选择调用不同的成员函数,实现多态性和灵活性。

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

相关·内容

C++函数对象优于函数指针地方

转载自:http://blog.csdn.net/huang_xw/article/details/7934156         C++编程语言中,有很多功能都与C语言相通,比如指针应用等等。...在这里我们介绍则是一种类似于函数指针C++函数对象相关介绍。C++函数对象不是函数指针。但是,程序代码中,它调用方式与函数指针一样,后面加个括号就可以了。...这是入门级随笔,说函数对象定义,使用,以及与函数指针,成员函数指针关系。 C++函数对象实质上是一个实现了operator()--括号操作符--。...既然C++函数对象函数指针使用方式上没什么区别,那为什么要用函数对象呢?很简单,函数对象可以携带附加数据,而指针就不行了。...int * pb = std::find_if(array, array + SIZE, less(40));  // pb 指向 30 位置 要想让一个函数既能接受函数指针,也能接受函数对象

72440

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

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

23440
  • 指针函数作用

    传递地址 指针传递地址时,指针变量产生了副本,但副本与原变量所指内存区域是同一个。对指针副本指向变量进行改变,就是改变原指针变量所指向变量。 指向函数指针 指针变量也可以指向一个函数。...一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针数据,即地址。其概念与以前类似,只是带回类型是指针类型而已。返回指针函数简称为指针函数。...指针数组 数组中元素均为指针变量数组称为指针数组,一维指针数组定义形式为: 类型名 *数组名 [数组长度]; 如: int *p[4]; 指针数组中数组名也是一个指针变量,该指针变量为指向指针指针...如: int *p[4]; int a=1; *p[0]=&a; p是一个指针数组,它每一个元素是一个指针型数据(其值为地址),指针数组p第一个值是变量a地址。...如int *(*p); " * “运算符表示p是一个指针变量,*(*p) 表示指向指针指针,” * "运算符结合性是从右到左,因此语句“int *(*p);”可写成“int **p;”。

    2.8K20

    三、文件操作、函数对象

    一个函数里面又调用了另外一个函数,这就是所谓函数嵌套调用  如果函数A中,调用了另外一个函数B,那么先把函数B中任务都执行完毕之后才会回到上次 函数A执行位置 局部变量 局部变量,就是函数内部定义变量...不同函数,可以定义相同名字局部变量,但是各用个不会产生影响 局部变量作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它作用 全局变量 函数外边定义变量叫做全局变量 全局变量能够在所有的如果一个函数在内部不调用其它函数...定义时有2种:新式和经典,上面的Car为经典,如果是Car(object)则为新式 命名规则按照"大驼峰" 创建对象 创建对象格式为: 对象名 = 名() __init__()方法...使用方式 def 名: #初始化函数,用来完成一些默认设定 def __init__(): pass __init__()方法,创建一个对象时默认被调用,不需要手动调用...self,可以理解为自己 可以把self当做C++中里面的this指针一样理解,就是对象自身意思 某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可

    1.3K60

    JS 函数 arguments 数组对象

    箭头函数中没有 arguments 1. arguments 介绍 众所周知,js 是一门非常灵活语言。...当我们 js 中调用一个函数时,经常会给函数传递一些参数,js 把调用函数时传入全部实参存储到一个叫做 arguments 数组对象里面 arguments 是一个数组对象,不是一个真正数组...这里做下总结 arguments 是数组对象(伪数组),即不是一个真正数组,而是一个对象。...它有 length 属性,并且可以通过下标获取元素,但是它不能调用数组方法,就是因为它不是真正数组,这一点可以通过查看它原型验证 2. arguments 转为数组 arguments 是数组对象...箭头函数中没有 arguments arguments 只存在于普通函数中,而在箭头函数中是不存在 下面代码抛出错误异常:Uncaught ReferenceError: arguments is not

    5.4K20

    C++this指针,静态成员,友元函数友元

    ---- 1. this指针 在上篇讲C++中对象,封装,继承(派生),多态时候,this指针出现在成员函数中,并使用->成员提取符操作成员变量。... C++ 中,每一个对象都能通过 this 指针来访问自己地址,this 指针是所有成员函数隐含参数,实际上成员函数默认第一个参数为T* const register this,this指针成员函数开始执行前构造...也就是说函数体内,静态变量具有“记忆”功能,即一个被声明为静态变量在这一函数被调用过程中其值维持不变,每个对象有各自成员变量,但是他们共享静态变量。所以静态变量相当于是大家共有资源。...所以this指针不能在静态函数中使用,静态函数如同静态变量一样,他不属于具体哪一个对象,静态函数表示了整个范围意义上信息,而this指针却实实在在对应一个对象,所以this指针不能被静态函数使用...:实现之间数据共享时,减少系统开销,提高效率,具体来说:为了使其他成员函数直接访问该类私有变量,同时也破坏了封装性,所以不到万不得已,还是不要用友元函数

    1.5K10

    【C++】多态 ⑧ ( 验证指向 虚函数 vptr 指针 | 对比定义了虚函数和没有定义虚函数大小 )

    存储到 " 虚函数表 " 中 ; 虚函数表 创建 : 中使用 virtual 关键字 声明 虚函数 时 , C++ 编译器 会自动为该类生成 " 虚函数表 " ; 生成虚函数前提是 至少有...1 个虚函数 ; 如果 没有虚函数 , 就不会生成虚函数表 ; 如果 中有 virtual 虚函数 , 则 该类 每个对象 中 , 都有一个 指向 虚函数 vptr 指针 ; 虚函数表 存储...中 , 重写了 父 virtual 虚函数 , 那么 C++ 编译器会在 子类 虚函数表 中放入该 子类虚函数 函数指针 ; 如果 C++ 中存在 virtual 虚函数 , 创建对象时 ,...; 2、虚函数与普通函数对比 - 多出了 vptr 指针大小 下面的代码中 , 定义了 2 个 , 区别是 一个定义了 virtual 虚函数 , 另外一个没有定义 虚函数 ; Parent...vptr 指针指向 虚函数表 首地址 Child c; // 将父指针指向子类对象 p = &c; // 通过父指针调用子类对象 fun 函数 p->fun(1); // 打印

    20540

    【C++修行之道】对象(二)6个默认成员函数、构造函数、析构函数

    中真的什么都没有?并不是,任何什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会自动生成(半自动化)成员函数称为默认成员函数。...构造函数是一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适初始值,并且在对象整个生命周期内只调用一次。...实际应用中,通常建议构造函数中初始化这些成员,以确保对象状态是确定。...所以d销毁时,要将其内部包含Time_t对象销毁,所以要调用Time析构函数。...注意:创建哪个对象则调用该类析构函数,销毁那个对象则调用该类析构函数 6.

    12910

    函数是连续Wolfram语言中处理新函数属性

    这可能会导致您定义出复杂得令人困惑表达式,如以下: 然后您可能会问,"f是连续?"或者 "f可以写成一个增函数g与另一个函数组合?"...复变函数还为数学天才Niels Henrik Abel和Carl Jacobi开发椭圆函数和积分宏伟理论提供了正确环境。 从那时起,纯数学和应用数学需求推动下,函数概念一直不断地发展。...如今,我们把函数简单地看作是任意对象集合之间一种抽象、多对一关系。 正方形和立方体 让我们从巴比伦正方形和立方体函数(分别用s和c表示)例子开始探索12.2版中函数属性。...椭圆函数 椭圆函数非线性振荡和许多其他应用研究中出现,有一种神秘感,因为它们很少本科课程中被讨论。当它们与三角函数一起被研究时,它们就不那么神秘了。...中参考页面来了解最新版本中函数属性,这些页面展示了每个函数范围,包括几何学、微积分和其他领域应用。

    1.1K20

    【C++】继承 ⑥ ( 继承中构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

    " 私有继承 " 派生 , 是 不具有 基 完整功能 , 因为 最终继承 后派生 , 无法 外部调用 父 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父指针 值为 子类对象 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类型指针 ; 引用 : 父引用 引用 子类对象 , 将 子类对象 赋值给 父类型引用 ; 二...或 父引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父指针类型 // 此处可以传入子类对象指针 void fun_pointer(Parent* obj) { obj...// 子类对象 可以调用 父公有函数 child.funParent(); // 将指向子类对象指针传给接收父指针函数 // 也是可以 fun_pointer...// 通过父指针调用父函数 p_parent->funParent(); // 将指向子类对象指针传给接收父指针函数 // 也是可以 fun_pointer

    26220

    【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 值 | 函数中 间接修改 指针变量 值 | 函数中 间接修改 外部变量 原理 )

    文章目录 一、直接修改 和 间接修改 指针变量 值 二、函数中 间接修改 指针变量 值 三、函数中 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 值 ---- 直接修改 指针变量...return 0; } 执行结果 : 二、函数中 间接修改 指针变量 值 ---- 函数 中 间接修改 指针变量 值 , 将 指向一级指针 二级指针 变量 , 传递到 函数形参 中 ,... 函数中 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量...n", p); // 函数中 , 简介修改指针值 modify_pointer(p2); // 打印一级指针地址 printf("%d\n", p);...三、函数中 间接修改 外部变量 原理 ---- 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为

    21.1K11

    Golang 函数返回类型是接口时返回对象指针还是值

    1.接口简介 Interface 是一组抽象方法(未具体实现方法,仅包含方法名参数返回值方法)集合,如果实现了 interface 中所有方法,即该类型就实现了该接口。...接口声明格式: type InterfaceName interface { //方法列表 } 2.函数返回类型是接口时返回对象指针还是值 函数返回类型是接口时返回对象指针还是值,这个要看具体需要...期望原对象在后续操作中被修改则返回对象指针。返回对象值则返回对象副本,对对象副本修改不会影响原对象。 返回对象指针示例。...=createEmployeeObj() o.Set() o.Print() e.Print() } 输出结果: company=alibaba company=alibaba 可见函数返回类型是接口时返回对象指针...company="alibaba" e1.Print() } e.Print() } 输出结果: company=alibaba company=tencent 可见函数返回类型是接口时返回对象

    8K30

    c++面向对象设计(谭浩强) 2.3成员函数

    工具函数 2.3.2 作用域限定符 :: 一般内部对成员函数作声明,然后外定义。...(良好习惯) 2.3.3 为了减少时间开销,体中定义成员函数中不包括循环等控制结构,c++系统 会自动地对她们作为内置函数来处理(inline) 对于体中定义函数,一般都省略inline 体外时...,需要声明inline void Student display() 2.3.4 成员函数储存方式 同一不同对象数据成员值一般是 不同,而不同对象函数代码是相同, 无论调用哪一个对象函数代码...每个对象所占用存储空间只是该对象数据成员所占用存储空间,而不包括函数代码 所占用存储空间。 this指针,用来指向不同对象。...说明: (1)无论成员函数内定义还是外定义,成员函数代码段存储方式是相同, 都不占用对象存储空间。 (2)无论是否用inline声明,成员函数代码段都不占用对象存储空间。

    40320

    【C++】STL 算法 ① ( STL 算法相关头文件 | 函数对象 仿函数 简介 | 函数调用操作符 | 重写函数调用操作符 | 函数对象 与 普通函数区别 )

    上面进行简单数学运算 模板函数 , 如 : 序列 上 执行 加减乘除 操作 ; 头文件 中 只 定义了一些模板 , 这些模板作用是 声明函数对象 ; STL 标准模板库...运算符函数 ) 中 简单介绍了 " 仿函数 " 概念 ; 结构体中 operator() 就是 重载 函数调用操作符 () 函数 ; C++ 语言中 struct 结构体 与 class 是等同...; }; 执行结果 : 4、函数对象 与 普通函数区别 函数对象 其 本质 是 对象 , 能突破 函数 概念 , 该类对象中 有成员变量 , 可以存储临时状态数据 ; 函数对象 / 仿函数 :...灵活性 : 由于 函数对象实例对象 , 开发时可以 通过 继承 和 重载 来 修改 重载函数调用操作符函数 行为 ; 效率 : 某些情况下 , 使用函数对象可能 比使用普通函数更有效率 ,...: 如果 调用 多个函数 , 每个函数需要保持各自状态 , 此时需要使用 函数对象 ; 普通函数 : 如果只需要 执行 一个简单 , 无状态 , 一次性 函数调用 操作 , 此时推荐使用 普通函数

    20310

    【C++】C++ this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    , 这个增加参数是 对象本身指针 ; Student 中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 对象本身 就是 左操作数 , 成员函数中 , 通过 this 指针访问对象本身成员 ; 全局函数中 , 实现两个 Student 相加 , 接收两个 Student 引用类型参数 , 引用相当于一级指针...Student 对象 , 就会报错 ; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 对象方式定义对象变量 ; class Student..., 将 两个 Student 对象相加 , 返回是一个匿名对象 , 该匿名对象 成员函数 中新创建对象 ; // 成员函数中, 将两个 Student 对象相加 // 全局函数 转为 成员函数...->height = this->height + s2.height; // 注意 : 返回是一个引用 , 就是返回自身对象变量 // this 是指针 , *this 是指针指向 自身对象

    21020

    【C++】C++ this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

    一、常量成员函数 1、const 修饰成员函数分析 C++ 中 , 普通非静态成员函数 , 可以使用 const 进行修饰 , 下面的 Student 中 , 定义了 void fun(int...age, int height) 成员函数 , 下面使用 const 关键字修饰该类 ; 使用 const 修饰 成员函数 , 写法如下 , fun() 之后使用 const 关键字修饰 函数 :... * 右边修饰指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 成员函数 // const 关键字可以 // void...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数中 不能修改 对象 任何成员变量 ; class Student { public: void fun..." << endl; } // 使用 const 修饰 成员函数 // const 关键字可以 // void fun(int age, int height) 之后 , 大括号之前

    20220

    【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式对象 构造函数和析构函数调用规则 1、场景说明 如果一个 既 继承了 基 , 又 中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到... 本身 构造函数 和 析构函数 , 父 构造函数 和 析构函数 , 成员变量 构造函数 和 析构函数 ; 2、调用规则 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下...继承了 A class B : public A ; 组合关系 : D 是一个普通 , C 中维护了一个 D 成员变量 ; class C : public B { public:...<< "C 析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 对象中 , 涉及到构造/析构函数 , 自身构造/析构函数...; A 和 B 构造函数 , 是 父构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父 -> 成员 -> 自身 , 符合上述调用原则

    18010

    【C++】多态 ⑩ ( 不建议将所有函数都声明为 virtual 虚函数 | 多态理解层次 | 父指针和子类指针步长 )

    没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父指针 步长是相同 ; 一、不建议将所有函数都声明为 virtual 虚函数 C++ 中 , 每个 成员函数 都可以声明为 virtual...调用 虚函数 可执行 子类对应函数 ; 多态实现条件 : ① 继承 , ② 虚函数重写 , ③ 父指针/引用指向子类对象 ; 父指针 可以 指向 父对象 , 也可以指向 不同 子类对象 ;...; 有 虚函数 , 编译时 , 会生成 虚函数表 , 对应中生成一个 vptr 指针指向 虚函数表 ; vptr 指针 是 与 对象绑定 , 调用时 从 对象函数表 中查找虚函数...; 通过 父指针 访问虚函数时 , 直接根据 实际对象 vptr 指针找该对象函数表 , 然后调用 虚函数表 中函数 ; 多态意义 : 多态是 设计模式 基础 , 是 软件框架 基础...自定义 Student 类型 , 则 p++ 计算结果是 p 指针地址值 加上 sizeof(*p) 对象字节长度 ; 显然 父 与 子类 对象 字节大小是不同 , 进行数组操作 ,

    26050

    python面向对象多态-相关内置函数-内置魔法函数-迭代器协议-上下文管理-04

    面向对象内置魔法函数 __str__ ''' __str__ 会在对象被转为字符串时,转换结果就是这个函数返回值 使用场景:我们可以利用该函数来自定义,对象是打印格式 ''' class...优化原理:将原本不固定属性数量,变得固定了,这样解释器就不会以这个对象创建名称空间(所以__dict__也没了),从而达到减少内存开销效果 另外当中出现了__slots__时将导致这个对象不再添加...语法原理 __getattribute__ 该函数也是用来获取属性 获取属性时如果存在__getattribute__则先执行该函数,如果没有拿到属性则继续调用__getattr__函数,如果拿到了则直接返回...,同时调用对应处理函数,当我们需要自定义对象比较规则时,就可以子类中覆盖大于等于等方法 案例 # 自定义对象比较 # 对象直接无法直接比较大小 class Person: def...,要参考当前场景,即上下文 python中,上下文可以理解为一个代码区间,一个范围,例如with open 打开文件仅在这个上下文中有效 上下文涉及到两个方法 __enter__:表示进入上下文

    66340
    领券