C++对C语言的拓展(5)—— 函数重载和函数指针结合

1、函数指针的介绍

函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下:

int add(int nLeft,int nRight);//函数定义  

该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可

int (*pf)(int,int);//未初始化 

则pf可指向int(int,int)类型的函数。pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则pf可指向int(int,int)类型的函数。而add类型为int(int,int),则pf可指向add函数。

pf = add;//通过赋值使得函数指针指向某具体函数  

注意:*pf两端的括号必不可少。

2、函数指针基本语法

//方法一:
typedef void (myTypeFunc)(int a, int b);//声明一个函数类型
myTypeFunc *myfuncp = NULL;//定义一个函数指针,这个指针指向函数的入口地址
//方法二:
typedef void (*myPTypeFunc)(int a, int b);//声明一个函数指针类型
myPTypeFunc fp = NULL;//通过函数指针类型定义了一个函数指针
//方法三:
void (*myVarPFunc)(int a,int b);//定义一个函数指针变量

当时用重载函数名对函数指针进行赋值时,根据重载规则挑选与函数指针参数列表一致的候选者,严格匹配候选者的函数类型指针的函数类型。

#include <iostream>
using namespace std;

int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a+b;
}

int func(const char* s)
{
    return strlen(s);
}

typedef int(*pf1)(int a);//int(*)(int a)
typedef int(*pf2)(int a,int b);//int(*)(int a,int b)

int main(void)
{
    int c = 0;

    pf1 p1 = func;
    c = p1(1);
    printf("c=%d\n", c);

    pf2 p2 = func;
    c = p2(1,2);
    printf("c=%d\n", c);

    retu

3、函数重载总结

  • 重载函数在本质上是相互独立的不同函数。
  • 函数的函数类型是不同的;
  • 函数返回值不能作为函数重载的依据;
  • 函数重载是由函数名和参数列表决定的。

原文地址:https://www.cnblogs.com/yuehouse/p/9787126.html

时间: 2024-11-06 07:45:52

C++对C语言的拓展(5)—— 函数重载和函数指针结合的相关文章

【C/C++学院】0813-C与CPP不同以及命名空间简介/函数重载与函数默认参数/泛型auto/Newdelete

C与CPP不同以及命名空间简介 命名空间在软件设计中的作用就是为了实现迭代式开发. 命名空间的别名 #include <iostream> namespace runrunrunrun { int a(10); char *str("gogogo"); namespace run //命名空间的嵌套 { int a(9); } } namespace runrunrunrun //命名空间的拓展 { int y(5); //int a(15);重定义错误 } namespa

实验2:函数重载、函数模板、简单类的定义和实现

实验目的 1. 掌握c++中函数的声明.定义.调用和参数传递方式 2. 掌握c++中带有默认形参值的函数声明和定义方法 3. 理解函数重载,掌握c++中函数重载的实现方式 4. 理解函数模板,掌握c++中函数模板的简单使用 5. 理解面向对象的抽象和封装,掌握c++中类的定义.实现和使用方法 实验准备 1. 函数的声明.定义.调用.参数传递方法 2. 带有默认形参值的函数 3. 函数重载 4. 函数模板(9.1.1节 + 9.3节) 其中,9.3节,理解3个常用的排序算法和两个常用的查找算法 5

C++ 函数重载与函数匹配

<C++ Primer>笔记,整理关于函数重载与函数匹配的笔记. 函数重载 void func(int a); //原函数 void func(double a); //正确:形参类型不同 void func(int a, int b); // 正确:形参个数不同 int func(int a); //错误:只有返回类型不同 typedef int int32; void func(int32 a); //与原函数等价:形参类型相同 void func(const int a); //与原函数

C++函数重载和函数模板

1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);float max(int a,int b);错 int max(int a,int b);float max(float a,float b);对 不能用形参的名字来重载: 1.3如果形参为引用类型或指针类型,则可以用关键字const来重载,即 int max(const int &a,const in

函数重载(续)==》函数重载和函数指针在一起

函数重载与函数指针(这一块很重要,后续要继续学习): 当使用重载函数名对函数指针赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 #include <iostream> using namespace std; void myFunc(int a) {     printf("a:%d\n",a); } void myFunc(char *p) {     printf("p:%s\n",p); } v

C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏

上一篇C++多态篇1一静态联编,动态联编.虚函数与虚函数表vtable中,我在最后分析了虚函数与虚函数表的内存布局,在下一篇详细剖析虚函数及虚函数表的过程中,我发现有关函数重载,函数覆盖,函数重写和函数协变的知识也要理解清楚才能对虚函数表在内存中的布局,对派生类的对象模型以及对多态的实现有更深的理解. 所以这一篇我作为一篇过渡篇,也同时对我以前写过的一篇博文进行一个收尾.在C++继承详解之二--派生类成员函数详解(函数隐藏.构造函数与兼容覆盖规则)文章中,我对函数覆盖,重载,重写提了一下,但是没

位运算+引用+const+new/delete+内联函数、函数重载、函数缺省参数

一.位运算 应用: 1.判断某一位是否为1 2.只改变其中某一位,而保持其它位都不变 位运算操作: 1.& 按位与(双目): 将某变量中的某些位清0(与0位与)且同时保留其它位不变(与1位与):获取某变量中某一位(与其位与后判断是否为该数) 2.|  按位或(双目): 将某变量中的某些位置1(与1位或)且保留其它位不变 3.^  按位异或(双目): 将某变量中的某些位取反(与1异或)且保留其它位不变 异或运算特点: 如果 a^b=c,那么就有 c^b = a以及c^a=b.(穷举法可证---用于

C++学习笔记之模板(1)——从函数重载到函数模板

一.函数重载 因为函数重载比较容易理解,并且非常有助于我们理解函数模板的意义,所以这里我们先来用一个经典的例子展示为什么要使用函数重载,这比读文字定义有效的多. 现在我们编写一个交换两个int变量值得函数,可以这样写: 1 void swap(int & a, int & b) 2 { 3 int tmp; 4 5 tmp = a; 6 a = b; 7 b = tmp; 8 9 } 假如我们现在想在与上面函数相同的文件中(可以理解为同一个main函数中)交换两个float变量呢,是不是需

小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧写一篇压压惊.把我文章抱走的同学留个言嘛. 函数在变成里面是一个非常重要的组成部分,那么这一部分我们先简单的介绍一下参数是如何传递进入函数,函数如何返回结果的.然后我们再来看看函数重载是个什么样的机制,最后在介绍一下所谓的函数指针到底是个什么东西.那么直接开始正题吧: 一.函数的参数传递 我们知道函

C++-函数重载(reload), 函数定义声明(void func(int))

对于相同的函数名字,根据其输入的变量不同进行函数重载 /* 根据函数的输入变量不同进行函数重载 */ #include <iostream> using namespace std; void foo(int i) { cout << "int foo(int i)" << endl; } void foo(int i, int j) { cout << "void foo(int i, int j)" <<