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

为什么返回类型不能是函数类型,而是c++中的函数指针?

在C++中,返回类型不能是函数类型,而是函数指针的原因有以下几点:

  1. 函数类型的大小不确定:函数类型的大小取决于函数的实现,而不同的函数可能有不同的实现,因此无法确定函数类型的大小。而函数指针的大小是确定的,因为它只是一个指向函数的地址。
  2. 函数类型无法进行赋值和比较:函数类型不能直接进行赋值和比较操作,因为函数类型是不可复制的。而函数指针可以进行赋值和比较,因为它只是一个指向函数的地址,可以通过指针进行间接调用。
  3. 函数指针可以作为回调函数:函数指针可以作为参数传递给其他函数,用于实现回调机制。通过函数指针,可以在运行时动态地指定要调用的函数,从而实现灵活的程序设计。
  4. 函数指针可以实现多态:通过函数指针,可以实现类似于面向对象编程中的多态特性。不同的函数指针可以指向不同的函数实现,从而实现不同的行为。

总结起来,返回函数指针而不是函数类型,是因为函数指针具有确定的大小、可以进行赋值和比较、可以作为回调函数和实现多态等优势。在C++中,函数指针是一种常用的机制,用于处理函数的灵活调用和动态行为。

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

相关·内容

【C++】函数指针 ① ( 函数三要素 | 函数类型 | 函数指针类型 | 函数类型重命名 )

: 函数的输入形参列表 ; 包含函数的输入参数 , 参数列表中可以没有参数 , 也可以有多个参数 ; 参数列表的类型和个数会影响函数的返回值类型 ; 函数返回值 : 函数体执行的返回结果 , 没有返回...void ; 函数执行后返回的数据类型 , 可以是任意的数据类型 , 包括基本数据类型和指针类型 , 返回值类型必须与函数定义时的返回值类型一致 ; 2、函数类型 函数类型 由返回值 , 参数列表类型...和 个数 共同决定 ; 函数类型示例 : 下面的函数类型 表示的函数 , 返回值为空 , 参数为 int 类型的 ; void (int) 3、函数指针类型 函数指针类型 是指指向函数的指针变量的类型...; 每个函数都有一个入口地址 , 这个地址是一个指针 , 指向函数的代码块在内存中的位置 ; 函数指针变量就是用来存储这个入口地址的变量 , 函数指针变量的类型需要与被调用的函数的类型匹配 , 即函数指针的类型应该与被调用的函数的返回值类型和参数列表类型一致...; newfunname 是 函数重命名的新名称 ; parameterlist 是 函数的参数列表 ; 为 函数类型 和 函数指针 类型 重命名 : // void (int) 函数类型重命名, 可以使用该类型指针接收函数地址

52150

C语言指针做函数参数,指针做函数返回类型

有时候我们可以使用函数的返回值来回传数据,在简单的情况下是可以的,但是如果返回值有其它用途(例如返回函数的执行状态量),或者要回传的数据不止一个,返回值就解决不了了,所以要引用上指针来传递。...指针的函数返回类型: 程序编译后,每个函数都有执行第一条指令的地址即首地址,称[函数指针。函数指针即指向函数的指针变量,要间接调用函数可以使用指针变量来实现。...int (*pf)(int, int); 通过将pf与括号中的“*”强制组合组合在一起,表示定义的pf是一个指针,然后与下面的“()”再次组合,表示的是该指针指向一个函数,括号里表示为int类型的参数,...因此,pf是指向函数的指针,该函数的返回值为int。函数指针与返回指针的函数的含义大不相同。函数指针本身是一个指向函数的指针。指针函数本身是一个返回值为指针的函数。...数组指针变量加减一个整数可使指针移动指向后面或数组元素,而函数指针的移动是毫无意义的。函数调用中“(* 指针变量名)”的两边的括号不可少,其中的“*”不应该理解为求值运算,在此处只是一种表示符号。

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

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

    8.1K30

    【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

    的 返回值 不是 " 函数重载 " 的 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型...函数类型 定义 函数指针 首先 , 使用 typedef 关键字 , 定义 函数类型 , 下面的代码 定义了 函数类型 func , 函数的 参数列表是 2 个 int 参数 , 返回值是 int ;..., 返回值是 int ; // 定义函数指针类型 func_ptr , 参数列表是 2 个 int 参数 , 返回值是 int typedef int (*func_ptr)(int a, int b...= add; 4、代码示例 - 不同方式定义函数指针 在下面的代码中 , 分别使用上述章节中讲解的三种方式 , 定义了函数指针 ; 代码示例 : // 包含 C++ 头文件 #include "iostream...返回值是 int typedef int (func)(int a, int b); // 定义函数指针类型 func , 参数列表是 2 个 int 参数 , 返回值是 int typedef int

    19930

    【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

    的 返回值 不是 " 函数重载 " 的 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型...函数类型 定义 函数指针 首先 , 使用 typedef 关键字 , 定义 函数类型 , 下面的代码 定义了 函数类型 func , 函数的 参数列表是 2 个 int 参数 , 返回值是 int ;..., 返回值是 int ; // 定义函数指针类型 func_ptr , 参数列表是 2 个 int 参数 , 返回值是 int typedef int (*func_ptr)(int a, int b...= add; 4、代码示例 - 不同方式定义函数指针 在下面的代码中 , 分别使用上述章节中讲解的三种方式 , 定义了函数指针 ; 代码示例 : // 包含 C++ 头文件 #include "iostream...返回值是 int typedef int (func)(int a, int b); // 定义函数指针类型 func , 参数列表是 2 个 int 参数 , 返回值是 int typedef int

    18830

    【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用 typedef 定义函数指针类型 )

    一、函数指针语法 1、函数名直接调用函数 定义一个函数 , 如下 函数的类型是 int(int, int) ; int add(int x, int y) { printf("x + y = %d\n...也可以 调用函数 ; 函数 int add(int x, int y) 的 类型是 int(int, int) , 函数类型只需要注明函数的 返回值 和 参数列表 类型即可 ; 直接定义 int(int..., int) 函数类型 的指针 , 将 add 函数名 ( 函数地址 ) 直接 赋值给 函数指针 , 可以直接通过函数指针调用函数 ; 下面的代码中 , 定义了函数指针 p , 指向 int(int,...是 函数返回值类型 ; newfunname 是 定义的函数类型名称 ; parameterlist 是 函数的参数列表 ; 定义函数类型示例 : 将 int add(int x, int y) 函数的...关键字 ; returntype 是 函数返回值类型 ; * 表示 定义的是 指针类型 , 指向函数地址 ; newfunname 是 定义的函数类型名称 ; parameterlist 是 函数的参数列表

    48160

    C++函数指针、指针函数、返回值为函数指针的函数浅谈

    C++函数指针、指针函数、返回值为函数指针的函数浅谈 引言 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。...而返回值为函数指针的指针函数就更难理解了,放在文章的最后来介绍。 函数指针 函数指针是一种特殊的 指针,它指向函数的入口。...endl; return 0; } 指针函数 指针函数是一种返回值为指针的 函数。...例如A *createA();声明了一个返回值为指向A类型的指针的,参数列表为空的函数(这句话读起来可能有一··绕口),实例说明 /** * 作者:lyn * 时间:2018.10.30 * 该程序用来演示指针函数...先给一个例子: /* *本例是SGISTL源码中的一个函数,比普通的返回值为函数指针的函数要更复杂一点 *因为本例中函数的参数也是一个函数指针 */ void (* set_malloc_handler

    1.6K10

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

    一、函数指针做函数参数 1、使用函数指针间接调用函数 在上一篇博客 【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用..., int); 定义函数 接收 pFun_add 类型的形参作为参数 , 该类型是 函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数中调用 函数指针 指向的 函数 ; // 传入函数指针...动态传入 ; 函数指针类型 的该用法 是框架的基础 , 将 函数执行逻辑 与 软件框架 进行解耦 ; 也就是 将 任务调用者 与 任务实现者 进行了隔离 , 解耦合 ; 下面的示例中 , 可以将 函数指针类型变量...约定了 函数的 参与者 ; 函数返回值类型 约定了 函数的 执行结果 ; 只要 将 子任务 按照 上述 " 函数指针类型 " 的约定 , 开发出 符合要求 的 函数 , 就可以将其作为一个 子任务 传递到...; 错误处理 : 使用函数指针 , 将错误处理函数作为参数传递给其他函数 , 在发生错误时立即调用适当的错误处理函数 , 无需返回到调用堆栈中的较高层次 ; 二、代码示例 - 函数指针做函数参数 代码示例

    1.5K50

    C++函数返回结果为自定义类型

    所以,规定不能返回局部对象的引用和指针。 函数的返回值不能是数组或函数类型,但可以是指向数组或函数的指针。 C++函数的返回值是局部变量时,该返回值可能是值类型、指针类型和引用类型。...数组形参 数组的两个特殊性质: 1.不能拷贝数组:无法值传递 2.使用数组时通常转化成指针:传递参数时,实际上传递的是指向数组首元素的指针 数组的大小对函数调用没影响 int GetInt() {...狗日的,这个东西书上也不说,但是代码里面一会儿就出现了,一会儿就出现了,搞人心态。 在C++中,函数的返回值是自定义类型的情况主要分为两种,一种是非引用类型的自定义类;另一种是引用类型的自定义类。...C++的基本数据类型限制了函数的返回类型,其不像Python一样可以直接返回一个list,list里面可以包含多个想要返回的内容。...格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 常量指针:int* const,必须初始化,值不会改变 指向常量的常量指针:const int* const 始终指向一个常量对象且不能被修改

    1.4K30

    【Kotlin】函数 ③ ( 匿名函数 | 匿名函数的函数类型 | 匿名函数的隐式返回 )

    文章目录 一、匿名函数 二、匿名函数的函数类型 三、匿名函数的隐式返回 一、匿名函数 ---- 声明函数时 , 没有 函数名 的函数 是 匿名函数 ; 匿名函数 可以作为 函数参数 , 也可以作为 函数返回值...Boolean) 扩展函数 , 接收一个 (Char) -> Boolean 类型的函数 , 用于 返回匹配给定 匿名函数 的字符数 ; /** * 返回匹配给定[谓词 predicate 匿名函数...决定 ; 有 相同 参数顺序 , 参数个数 和 返回值类型 的函数 , 其 函数类型相同 ; 如上个章节 , 扩展函数 CharSequence.count 接收的匿名函数参数 predicate ,...关键字 , 返回返回值 ; 匿名函数 的 返回值 不需要使用 return 关键字 , 匿名函数 可以 隐式 返回 函数体最后一行语句 ; 代码示例 : 在匿名函数中 , 第一行是 Int 值 , 第二行是...Boolean 值 , 第三行是 String 值 , 最后返回的是最后一行 String 值 ; fun main() { // 声明 函数类型 变量, 并为其赋值 匿名函数 val

    3.1K20

    【C++】C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 的引用或指针 | 函数内的 “ 局部变量 “ 的引用或指针做函数返回值无意义 )

    一、函数返回值不能是 " 局部变量 " 的引用或指针 1、引用通常做右值 之前使用 引用 时 , 都是作为 右值 使用 , 引用只在 声明 的 同时 进行初始化时 , 才作为左值 , // 定义变量 a...2、函数返回值特点 函数 的 返回值 几乎很少是 引用 或 指针 ; 函数 的 计算结果 经常是借用 参数中的 地址 / 引用 进行返回的 , 函数 的 返回值 一般返回一个 int 类型的值 , 如果...如果 是 外部的 main 函数中的 变量 的 地址 / 引用 , 那么 肯定是从 参数中 传入的 , 那么这个 地址 / 引用 就不需要返回 , 函数内部修改 , 直接体现在了外部的变量中 ; 因此...如果 想要 在 函数中 , 返回 引用 / 指针 , 函数局部变量的 引用 / 指针 是返回不出来的 , 即使强行返回 引用 / 指针 , 也是当前 局部变量 被 分配的 栈内存 地址 , 该函数 执行完毕后..., 该 指针 是 局部变量 的指针 ; 上述两个函数是无意义的 , 获取到 函数 返回的 " 局部变量 " 的 引用 或 指针 , 然后获取地址 , 发现获取的都是随机值 , 都是无意义的值 ; num21

    60220

    函数出错返回的数据类型

    函数出错返回的数据类型有4中情况:错误码、NULL值、空对象、异常对象。 1. 错误码 C语言中没有异常这样的语法机制,返回错误码便是最常用的的出错处理方式。...对于查找函数(get、find、select、search、query 等单词开头的函数),数据不存在是一种正常行为,并非是一种异常情况,所以返回表示不存在语义的NULL值比返回异常更合理。...2.1 弊端 很多人认为返回NULL值是一种不好的设计思路的两个主要理由: 若函数可能返回NULL值,当使用时忘记做NULL值判断,可能会抛出空指针异常(Null Pointer Exception,NPE...当函数返回的数据是字符串类型或者集合类型的时候,我们可以用空字符串或空集合替代 NULL 值,来表示不存在的情况。这样,我们在使用函数的时候,就可以不用做 NULL 值判断。...如果函数是 public 的,你无法掌控会被谁调用以及如何调用(有可能某个同事一时疏忽,传递进了 NULL 值,这种情况也是存在的),为了尽可能提高代码的健壮性,我们最好是在 public 函数中做 NULL

    2.2K20

    父类返回子类类型的函数写法

    不过由于我们的这个 Event 的类型比较多,因此希望写一个父类,来一个子类感受下: class DisposableEventBuilder : EventBuilder() { private....build() 我们调用完父类的 retryLimit 方法后,想要设置下 delay,结果发现没有这个方法。 “我 X,这什么玩意儿”,你嘟囔了一句。 因为返回的是父类,所以链式调用掉链子了。...retryLimit return this as T } abstract fun build(): PollingEvent } 这个泛型给父类加了一个泛型参数,这个参数则必须是当前类的子类...,那么这样的话我们就可以在返回自身类型的位置返回 T 这个类型了。...子类的改动就很简单了,只需要给父类加一个泛型参数为自己的类型即可: class DisposableEventBuilder : EventBuilder

    4.8K10

    Python 字符串中返回bool类型的函数集合

    字符串中返回bool类型的函数集合 isspace 功能: 判断字符串是否是由一个空格组成的字符串 用法: booltype = string.isspace() -> 无参数可传 ,返回一个布尔类型...注意: 由空格组成的字符串,不是空字符串 : “’!...=‘’’ istitile 功能: 判断字符串是否是一个标题类型 用法 booltype = String.istitle() -> 无参数可传, 返回一个布尔类型 注意: 该函数只能用于英文 isupper...与islower 功能: isupper判断字符串中的字母是否都是大写 islower判断字符串中的字母是否都是小写 用法: booltype = string.isupper() -> 无参数可传..., 返回一个布尔类型 booltype = string,islower() ->无参数可传 ,返回一个布尔类型 注意: 只检测字符串里的字母,对其他字符不做判断 join与split 稍后见 我们数据类型转换的时候见

    2.4K20

    c++类的类型转换函数

    参考链接: C++类型转换 之前学习的,可以将普通类型转换为类类型,需要借助转换构造函数。那么反过来,类类型可以转换为普通类型吗? ...类型转换函数必须是成员函数,不能指定其返回类型,并且形参必须为空,返回值是隐含的,返回值类型是和转换的类型Type是相同的,在本例子中为int。  2....Type表示内置类型名、类类型名或者是类型别名(typedef)。除了void外,任何可作为函数返回类型的类型都可以定义转换函数的目标转换类型。...一般不允许转换为数组或函数类型,但是可以转换为指针类型以及引用类型  3. 类型转换函数一般不应该改变被转换的对象,因此转换函数通常属性被定义为const。 ...右值的类型转换函数和左值的转换构造函数都可以实现隐式的类型转换,那么如果二者同时存在于代码中,在需要类型转换时,编译器会选择调用谁?

    91120

    【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )

    参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境中 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用的都是指针类型参数...指针作为参数和返回值 ---- 指针作为参数和返回值 : 如果是指针作为参数 , 修改 N 维指针指向的地址 , 那么需要传入 N + 1 维指针 , 传入指向该 N 维指针 的指针参数 ( N + 1...C 语言中的参数 分类 : ① 普通变量参数 : C 语言中 普通变量 ( 非指针变量 ) 作为参数 , 只能进行值传递 , 不能通过参数返回结果 ; ② 指针变量参数 : C 语言中 , 如果要让函数的参数可以将结果返回...C++ 中的引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数的情况 , 使参数具有返回结果的能力 ; 3 ....引用作为参数和返回值 ---- 引用作为参数和返回值 : 如果是引用作为参数 , 修改 N 维指针指向的地址 , 那么需要传入 N 维指针的引用即可 ,在函数中修改该引用 , 即可修改外部的被引用的变量

    2.2K20

    是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型

    分析Vue.js组件中的data为何是函数类型而非对象类型 引言 正文 一、Vue.js中data的使用 二、data为对象类型 三、data为函数 结束语 引言 要理解本篇文章,必须具备JavaScript...let vm1 =new Vue() //此时的vm1应该是这样的 vm1 = { //这里的data,是先获取了函数Vue中的data(data的值为函数),然后得到了data的返回值 this.data...= new Vue() //此时vm2是这样的 vm2 = { //这里的data,是先获取了函数Vue中的data(data的值为函数),然后得到了data的返回值 data: { name...这是因为这两个实例对象在创建时,是先获得了一个函数,将该函数的返回值作为了自己属性data的值,并且这两个实例对象中data的值在栈中对应的堆中的地址也不一样,所以他们不会互相影响。...因为我们刚开始定义了构造函数Vue时,给他内部的data设置了一个值,该值为对象类型,对象类型在js中称为引用数据类型,在栈中是存储着一个指向内存中该对象的堆中的地址。

    3.5K30
    领券