c++函数指针使用示例分享_C 语言

需求
假设要设计一个名为estimate()的函数,估算编写指定行数的代码所需的时间,并且希望不同的程序员都可以使用该函数。

对于所有的用户来说,estimate()中一部分代码都是相同的,但该函数允许每个程序员提供自己的算法来估算时间。

为实现目标,采用的机制是,将程序员要使用的算法函数的地址传递给estimate()。

实现代码如下

复制代码 代码如下:

// funpointer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>double betsy(int);
double pam(int);

//estimate函数的第二个参数接受一个函数指针
void estimate(int lines,double (*pf)(int));

int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;
    int code;
    cout<<"How many lines of code do you need?"<<endl;
    cin>>code;
    cout<<"Here's Betsy's estimate:"<<endl;
    estimate(code,betsy);
    cout<<"Here's Pam's estimate:"<<endl;
    estimate(code,pam);
    getchar();
    getchar();
    return 0;
}
inline double betsy(int lines){return 0.05*lines;}

inline double pam(int lines){return 0.03*lines+0.004*lines*lines;}

inline void estimate(int lines,double (*pf)(int))
{
    using namespace std;
    cout<<lines<<" lines will take "<<(*pf)(lines)<<"hour(s)"<<endl;
}

运行结果

使用函数指针的好处
以上设计有助于今后的程序开发。当某个程序员为估算时间开发自己的算法时,他将不需要重新编写estimate()函数。相反,他只需要提供自己的函数地址,并保证该函数的参数和返回类型正确即可。

函数指针使得程序员可以修改estimate()的行为,虽然他接触不到estimate()的源代码。

内联函数
由于函数实现的功能较简单,所以可以使用内联函数来代替常规函数。

要使用内联函数(C++的新特性,用于提高程序运行速度),必须采取下述措施之一:

在函数声明前加上关键字inline
在函数定义前加上关键字inline
内链函数的运行速度比常规函数稍快,但代价是需要占用更多内存。如果程序在10个不同的地方调用了同一个内联函数,则改程序将包含该函数代码的10个副本,如下图所示:

什么情况下应该考虑使用内联函数?
 函数代码执行时间很短
如果使用C语言的宏执行了类似函数的功能,应考虑将他们转换为C++内联函数
 注意:当函数过大或函数递归 了,则编译器可能不会将其视为内联函数对待。

时间: 2024-09-15 07:49:03

c++函数指针使用示例分享_C 语言的相关文章

C语言中的函数指针基础学习教程_C 语言

顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型. B) 也很简单,与C)表达式相比,唯一不同的就是函数的

用C语言获取文件的大小示例分享_C 语言

查了一下发现同C语言的文件操作函数便可以很容易的实现这样的功能.在自己实现的函数中使用到的函数就只有fseek和ftell.它们的说明如下: fseek 语法: #include <stdio.h> int fseek( FILE *stream, long offset, int origin ); 函数fseek()为给出的流设置位置数据. origin的值应该是下列值其中之一(在stdio.h中定义): 名称 说明 SEEK_SET 从文件的开始处开始搜索 SEEK_CUR 从当前位置开

C#委托所蕴含的函数指针概念详细解析_C 语言

原则: 1.函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用 一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入 2.回调函数callback使用的技术就是函数指针: 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用.为此,你需要做三件事: 1). 声明: 2). 定义: 3). 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用. 回调函数是应用程序提供给Windo

纯c语言实现面向对象分析与示例分享_C 语言

C语言的对象化模型面向对象的特征主要包括:.封装,隐藏内部实现.继承,复用现有代码.多态,改写对象行为1.1  封装封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性.封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的.封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来

使用c语言生成随机数的示例分享_C 语言

这是一个自己用c写的不重复产生随机数的代码,且只有输入q才能退出程序. 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX  100 int main(void){ int i, j, flag, num, a[MAX] = { 0 }, max, ch; srand((unsigned)time(NULL));  printf("Please input m

c语言尾队列tailq使用示例分享_C 语言

queue和list的结构定义和操作都在'sys/queue.h'中完成, 主要定义了下面四种数据结构: 1单向列表(single-linked lists)2单向尾队列(single-linked tail queue)3列表(lists)4尾队列(tail queues) 使用示例 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <sys/queue.h> /*  定义一个结构体,它只是尾队列的一个元

c语言定时器示例分享_C 语言

在linux下开发,使用的是C语言.适用于需要定时的软件开发,以系统真实的时间来计算,它送出SIGALRM信号.每隔一秒定时一次 c语言定时器 复制代码 代码如下: #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h>#include <ctype.h>#include <stdio.

实现posix消息队列示例分享_C 语言

mqueue.h 复制代码 代码如下: ////  mqueue.h//  UNIX_C////  Created by 周凯 on 14-2-9.//  Copyright (c) 2014年 zk. All rights reserved.// #ifndef __PS_MQUEUE_H#define __PS_MQUEUE_H #include <unistd.h>#include <sys/types.h> typedef struct mq_info     *mqd_t

C++ vector删除符合条件的元素示例分享_C 语言

C++ vector中实际删除元素使用的是容器vecrot std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position);//删除指定元素 iterator erase (iterator first, iterator last);//删除指定范围内的元素 返回值:指向删除元素(或范围