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

【C++】函数指针 ④ ( 函数指针函数参数 | 使用函数指针间接调用函数 | 函数指针做参数 | 函数指针类型本质 | 函数指针做参数意义 )

, 调用函数可以动态指定 ; 2、函数指针做参数 定义了 如下 函数指针类型 pFun_add , 其类型为 int (*)(int, int) , 该指针指向一个 类型为 int (int, int..., int); 定义函数 接收 pFun_add 类型形参作为参数 , 该类型函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数调用 函数指针 指向 函数 ; // 传入函数指针...动态传入 ; 函数指针类型 该用法 是框架基础 , 将 函数执行逻辑 与 软件框架 进行解耦 ; 也就是 将 任务调用者 与 任务实现者 进行了隔离 , 解耦合 ; 下面的示例中 , 可以将 函数指针类型变量...; 作为回调函数 : 函数指针 可以作为 回调函数 ; 先将 函数指针变量 作为 实参 传递给 其它函数 , 在 接收函数指针 函数内部 , 满足某种条件时直接调用函数指针 指向 函数 , 这样实现了回调...C 语言 中模拟面向对象用法 ; 可以将特定 函数指针类型 定义为 结构体 一部分 , 并使用该 结构体 来传递具有特定行为对象地址 ; 该操作有助于更好地组织代码 , 使代码更易于理解和维护

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

《C++Primer》第十九章

析构函数调用 就像定位new与使用allocate类似一样,对析构函数调用也与使用destroy很类似。...,那么我们必须地声明函数类型以明确指出来我们想要使用是哪个函数 // 例如我们可以声明一个指针, 令其指向含有两个形参get: char (Screen::*pmf2)(Screen::pos,...action(myScreen, &Screen::get); // 地传入地址 2.3 成员指针函数表 对于普通函数指针指向成员函数指针来说,一种常见用法是将其存入一个函数表当中。...将成员函数用作可调用对象 要想通过有一个指向成员函数指针进行函数调用必须首先利用.*或者->*运算符将该指针绑定到特定对象上。...使用union类型 和其他内置类型一样,默认情况下union是未初始化,我们可以像地初始化聚合类一样用一对花括号内初始值地初始化一个union: Token first_token = {'

1.3K10

第 19 章 特殊工具与技术

第一步,new表达式调用一个名为 operator new标准库函数,来分配一块足够大,原始,未命名内存空间,以便存储特定类型对象(或者对象数组)。...当编译器发现一条 new表达式或 delete表达式后,将在程序中查找可供调用 operator函数。如果被分配(释放)对象是类类型,则查找顺序如下。 首先在类及其基类作用域中查找。...Heap2", 10); // 析构对象并回收使用 new表达式开辟空间 delete pc2; delete pc4; // 调用析构函数来析构对象 pc3...,如果成员存在重载问题,则我们必须地声明函数类型以明确指出我们想要使用是哪个函数。...因为链接指示同时作用于声明语句中所有函数,所以如果我们希望给 C++函数传入一个指向 C函数指针,则必须使用类型别名。

72440

深入解析C语言数组和指针(0)

显然它是一个指针,确切说是"指向整型指针"指针,即指针指针。那么表达式**c类型就是int,注意*操作符具有从右向左结合性。...第四行似乎把f声明为一个数组,它元素类型是返回为整型函数。但是这个声明也是非法,因为数组元素必须具有相同长度,但不同函数显然具有不同长度。   ...第五行首先执行括号内*f[],所以f是一个元素是某种类型指针数组。表达式末尾()是函数调用操作符,所以f肯定是一个数组,数组元素类型函数指针,它所指向函数返回值是一个整型值。   ...int strlen( char string[]);   值得注意是第一种声明无法知道数组长度,所以函数如果需要知道数组长度,它必须作为一个参数传递给函数。...剩下几维必须显示出来,这样编译器就能推断出每个子数组维数长度。

1.3K30

第 19 章 特殊工具与技术

当编译器发现一条 new表达式或 delete表达式后,将在程序中查找可供调用 operator函数。如果被分配(释放)对象是类类型,则查找顺序如下。 首先在类及其基类作用域中查找。...Heap2", 10); // 析构对象并回收使用 new表达式开辟空间 delete pc2; delete pc4; // 调用析构函数来析构对象 pc3...,如果成员存在重载问题,则我们必须地声明函数类型以明确指出我们想要使用是哪个函数。...指向 C函数指针指向 C++函数指针是不一样类型。...因为链接指示同时作用于声明语句中所有函数,所以如果我们希望给 C++函数传入一个指向 C函数指针,则必须使用类型别名。

80550

第 14 章 重载运算与类型转换

成员运算符函数)参数数量比运算对象数量少一个。...operator+(data1, data2); 如果重载运算符函数是成员函数的话,还可以像调用其他成员函数一样调用运算符函数。...所以实践中很少定义类型转换运算符,不过为了方便将表达式用作条件判读,定义向 bool类型转换还是较为普遍。为了防止自动发生类型转换,C++11新标准引入了类型转换运算符。...转换必须通过强制类型转换才可以使用,不过当用作条件判断时,编译器还是会自动执行类型转换。...想要执行上面的调用,就必须调用转换构造函数类型转换运算符 A a = f(b.operator A()); A a = f(A(b)); 如果在同一个类中定义了多个转换源(或转换目标)是算术类型转换时

87160

c++从入门到进阶--引用与常量

constexpr函数必须满足下述限制: 函数返回值不能是void类型 函数体不能声明变量或定义新类型 函数体只能包含声明、null语句或者一条return语句 在形参实参结合后,return语句中表达式为常量表达式...四.引用 左值与右值 区别 左值 右值 赋值表达式 出现在赋值号左边 在赋值号右边 地址与名字 可以取地址有名字 不能取地址没有名字 生成表达式 返回左值引用函数 赋值 下标 解引用和前缀自增自减运算符...是左值 调用标准库中定义函数std::move() move()函数返回给定对象右值引用, 可以将一个左值转换为对应右值引用类型。...②地址传递 地址传递与值传递不同在于,它把实参存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针指向地址中内容任何改变都会影响到实参。...返回类型和return语句 return 语句形式 return; return表达式; 非void函数必须返回一个与声明类型匹配值否则会引起编译错误。

73220

C++进阶之路:探索访问限定符、封装与this指针奥秘(类与对象_上篇)

例如,a是A对象,则在表达式a.M中,M具有类A作用域。 在该类(A)某个指向对象指针该成员(M)表达式中。...例如,Pa是一个指向A类对象指针,则在表达式Pa->M中,M具有类A作用域。 在使用作用域运算符所限定该成员中。例如,在表达式A::M中,M具有类A作用域。...在C++中,编译器为每个非静态成员函数地传递一个名为this指针,该指针指向调用函数对象。 这使得成员函数能够知道它们应该操作哪个对象数据成员。这个过程对用户是透明。...在 C++ 中,当你有一个指向对象指针,并试图通过该指针调用成员函数时,编译器会生成代码来隐地传递一个指向该对象 this 指针给成员函数。...尽管在源代码中你并不会地看到 this 指针传递和使用,但编译器会在编译时为你处理这些细节。 this指针可以为空吗?

9110

校长讲堂第五讲

为了模仿电源打开情形,我们要设计一条 C 语句来调用这个子程序。经过一些思考,我们写出了下面的语句: (*(void(*)())0)(); 这样表达式会令 C 程序员心惊胆战。...首先,假设我们有一个变量 fp,它包含了一个函数指针,并且我们希望调用 fp 所指向函数。...如果 C 可以读入并理解类型,我们可以写: (*0)(); 但这样并不行,因为*运算符要求必须有一个指针作为他操作数。另外,这个操作数必须是一个指向函数指针,以保证*结果可以被调用。...因此,我们需要将 0 转换为一个可以描述“指向一个返回 void 函数指针类型。...它们具有真正运算符中最高优先级。由于函数调用比一元运算符绑定得更紧密,你必须写(*p)()来调用 p 指向函数;*p()表示 p 是一个返回一个指针函数

41831

《C++Primer》第十四章 重载运算与类型转换

第十四章 重载运算与类型转换 基本概念 当一个重载符是成员函数时,this绑定到左侧运算对象,成员运算符)参数数量比运算对象数量少一个 运算符函数必须要么是类成员,要么最少含有一个类类型参数...对于形如point->mem表达式来说,point必须指向对象指针或者是一个重载了operator->对象。...可调用对象与function C++语言中有几种可调用对象:函数函数指针、lambda表达式、bind创建对象以及重载了函数调用运算符类。...因此,我们不允许转换成数组或者函数类型,但允许转换成指针(包括数组指针以及函数指针)或者引用类型类型转换运算符既没有返回类型,也没有形参,而且必须定义成类成员函数。...3; // 正确:SmallInt构造函数不是 si + 3; // 错误:此处需要隐类型转换,但类运算符是 static_cast(si) + 3; // 正确:地请求类型转换

88710

C++补充知识&C++11及其特性

C++补充知识&C++11及其特性 explicit关键字 加在类构造函数前表明该构造函数,并非隐,不能进行隐类型转换! 类构造函数默认情况下声明为隐。...给构造函数加上关键字explicit使得该类创建对象必须调用构造。...右值(rvalue)——通过排他性来定义,每个表达式不是左值就是右值,rvalue是不在内存中占有确定位置表达式,而是在存在寄存器中。 所有的左值(无论是数组,函数或不完全类型)都可以转化成右值。...把空指针转换成目标类型指针。 把任何类型表达式转换成void类型。 (写了会提醒编译器检查,提醒其他程序员要注意。) (没事别转。)...用法: TYPE b = reinterpret_cast (a) TYPE必须是一个指针、引用、算术类型函数指针. int* p = reinterpret_cast(0x999999

37810

第 13 章 拷贝控制

拷贝构造函数第一个参数类型必须是一个引用类型,因为如果不是引用类型,则在进行形参初始化时,会调用拷贝构造函数,这样就会导致无限循环。...所以,隐销毁一个分配动态内存内置指针类型成员,并不会 delete它所指向对象,需要调用 delete来回收资源。...对于动态分配对象,当对指向指针应用 delete运算符时被销毁。 对于临时对象,当创建它完整表达式结束时被销毁。...可以通过标准库中 move函数地将一个左值转换为对应右值引用类型。在对一个对象使用 move函数后,可以对这个移后源对象进行销毁或赋值操作,但不能再使用它!...与拷贝操作不同,移动操作永远不会隐地定义为删除函数。如果既没有地要求生成=default移动操作,又不满足编译器合成移动操作条件,编译器根本就不会合成它们。

97150

C++:16---强制类型转换和类型转换

旧式强制类型转换 在早期C/C++中,地进行强制类型转换有以下两种形式: type (expr) ; //函数形式强制类型转换 (type) expr; //...一、static_cast 功能:用来强迫隐类型转换,或称为类型转换 static_cast还可以将一个左值转换为右值引用 例如: 将非const对象转换为const对象(但是不能将底层const...j = 1; double slope1 = i / j; //一般强制类型转换,编译器可能会报出警告 double slope2 = static_cast(j) / j; //地强制类型...,使用形式如下所示: 在第一种形式下:e必须是一个有效指针 在第二种形式下:e必须是一个左值 在第三种形式下:e不能使左值 type:必须是一个类类型,并且通常情况下该类型应该含有虚函数 比如:...指针类型dynamic_cast 假设Base含有虚函数,且Derived是Base公有派生类 如果有一个指向Base指针bp,则我们可以在运行时将它转换成指向Derived指针

1.9K20

数组与指针

,则自动调用该类默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组元素提供初始化。     ...4、对指针进行初始化或者赋值只能使用以下四种类型值: 0值常量表达式 类型匹配对象地址 另一个对象之后下一个地址 同类型另一个有效指针         5.具有void* 类型指针可以保存任意类型对象地址...标准库函数strlen总是假定其参数字符串以null字符结束,当调用该标准库函数时,系统将会从实参ca指向内存空间开始一直搜索结束符,知道恰好遇到null位置。...2、初始化动态分配数组          动态分配数组时,如果数组元素具有类型,将使用该类默认构造函数,初始化,如果是内置类型就无初始化。...3、动态空间释放          动态分配内存最后必须进行释放,否则,内存最终将会逐渐耗尽。c++为指针提供deletep[]表达式来释放所指向数组空间。

1.1K80

C语言与C++面试知识总结

指向调用该成员函数那个对象。 当对一个对象调用成员函数时,编译程序先将对象地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐使用 this 指针。...当一个成员函数调用时,自动向它传递一个隐含参数,该参数是一个指向这个成员函数所在对象指针。...inline 内联函数 特征 相当于把内联函数里面的内容写在调用内联函数处; 相当于不用执行进入函数步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环...位域在内存中布局是与机器有关 位域类型必须是整型或枚举类型,带符号类型位域行为将因具体实现而定 取地址运算符(&)不能作用于位域,任何指针都无法指向位域 extern "C" 被 extern...继承:结构体嵌套 多态:父类与子类方法函数指针不同 explicit()关键字 explicit 修饰构造函数时,可以防止隐转换和复制初始化 explicit 修饰转换函数时,可以防止隐转换

4.9K41

《C++Primer》第十三章 拷贝控制

第十三章 拷贝控制 简介 当定义一个类时,我们或者隐地指定此类型对象拷贝、移动、赋值和销毁时做什么。...参数和返回值 在函数调用过程中,具有非引用类型参数要进行拷贝初始化 当一个函数具有非引用返回类型时,返回值会被用来初始化调用结果 拷贝构造函数被用来初始化非引用类类型参数,这一特性解释了为什么拷贝构造函数自己参数必须是引用类型...如果其参数不是引用类型,那么其调用永远不会成功——为了调用拷贝构造函数,我们必须拷贝它实参,但为了拷贝它实参,我们又需要调用拷贝构造函数,如此无限循环。...内置类型无析构函数,因此销毁内置类型成员什么也不做。 隐销毁一个内置指针类型成员不会delete它指向对象。但是智能指针是类类型,所以具有析构函数,因此指向对象在析构阶段会被销毁。...当我们希望在vector重新分配内存这类情况下对我们自定义类型对象进行移动而不是拷贝,就必须地告诉标准库我们移动构造函数不会发生异常,可以安全使用。

1.6K40

什么?CC++面试过不了?因为你还没看过这个!

指向调用该成员函数那个对象。 当对一个对象调用成员函数时,编译程序先将对象地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐使用 this 指针。...当一个成员函数调用时,自动向它传递一个隐含参数,该参数是一个指向这个成员函数所在对象指针。...inline 内联函数 特征 相当于把内联函数里面的内容写在调用内联函数处; 相当于不用执行进入函数步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、...位域在内存中布局是与机器有关 位域类型必须是整型或枚举类型,带符号类型位域行为将因具体实现而定 取地址运算符(&)不能作用于位域,任何指针都无法指向位域 extern "C" 被 extern...继承:结构体嵌套 多态:父类与子类方法函数指针不同 explicit()关键字 explicit 修饰构造函数时,可以防止隐转换和复制初始化 explicit 修饰转换函数时,可以防止隐转换

3.6K50

【C++】智能指针详解

程序用堆来存储动态分配对象即那些在程序运行时分配对象,当动态对象不再使用时,我们代码必须销毁它们。...对于一个定义了默认构造函数类型,其const动态对象可以隐初始化,而其他类型对象就必须初始化。由于分配对象就必须初始化。...动态对象生存周期直到被释放时为止 由shared_ptr管理内存在最后一个shared_ptr销毁时会被自动释放,但是通过内置指针类型来管理内存就不是这样了,内置类型指针管理动态对象,直到被释放之前都是存在...在创建或reset一个这种unique_ptr类型对象时,必须提供一个指定类型调用对象删除器。...weak_ptr操作 由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock,此函数检查weak_ptr指向对象是否存在。

75730

【笔记】《C++Primer》—— 第三部分:类设计者工具

有时候我们想要有一个函数表储存指向调用对象指针,然后按照所需调用形式来检索对象,对此我们可以用map来实现,让运算符为key,可调用对象为value但是此时会发现我们希望可调用对象为value,...,也就是对象最多可能隐发生两次转换,这就容易导致二义性问题 如果调用重载时我们需要写出转换或用强制类型转换,则常常说明我们设计有不足 类型转换中有一个转换比较特别,那就是bool类型转换。...将类朝bool类型进行转换是最常见一种做法,但C11加入了类型转换来限制它,编译器不会隐进行这个转换,也就是我们必须使用强制类型转换才能使用。...如果表达式不是引用也不是指针,则其动态类型永远与静态类型一致 派生类可以往基类类型转换,而基类不能隐反向转换 一个派生类函数如果想要覆盖继承来函数,那必须名称和形参都一致,否则编译器会认为这两个函数是独立...,但是注意绑定到非类型整型必须是常量表达式,绑定到指针或引用对象必须有静态生存期(都是为了可以在编译期完成所要求) 模板提供者必须保证模板实例化时依赖于模板参数名字都必须有定义,其他要保证对编译器可见

1.7K10
领券