1. 内联函数
void printAB(int a,int b)
{
  cout<<(a)<<(b)<<endl;
}
int main(void)
{
  for(int i=0;i<1000;i++)
  {
    int j=i+1;
    printAB(i,j);//(1)
    //在调用普通函数的时候,有压栈的过程,要将printAB压入栈中,要复制两个实参,压入栈中,还要copy返回值,还要出栈。
  }
}
优化空间:
1. 改成宏函数
#define printAB(a,b)\
cout<<(a)<<(b)<<endl;//语句
//但是宏函数相当于宏替换,直接将语句原封不动丢到(1)中替换而已。这是预编译器干的事。

2.改成inline void printAB(int a,int b);
那么编译器会在(1)处,将printAB(i,j);替换为(两个花括号也是),少了很多压栈和复制的过程。
{
  cout<<(i)<<(j)<<endl;
}

注意的地方:
C++声明和定义是可以分开写的,要达到内联函数的效果,声明和定义都要写inline关键字。
Inline函数,仅用于代码量少,使用频繁的函数中,并且要被大量循环执行的函数。如果存在循环语句,那么Inline相当于没写了。

2. 参数占位符
void function(int x,int);//第二个参数是用来占位的,是用来方法重载的时候作区别

3. 函数重载

4.函数指针
int func(int a,int b){...}

方法1:
//定义一种函数类型
typedef int(MY_FUNC)(int,int);(推荐)
// C# delegate int MY_FUNC(int a,int b);
使用:
int main(void)
{
  MY_FUNC*fp=NULL;
  fp=func;
  fp(10,10);
  //C# MY_FUNC fp=func;
}
方法二:(不推荐)
//定义一种指向函数类型的指针类型
typedef int(*MY_FUNC_P)(int,int);
int main(void)
{
  MY_FUNC_P fp=NULL;
  fp=func;
  fp(10,10);
}
方法三:(常用)
//在函数中定义,用于传递回调函数
int main(void)
{
  int(*fp)(int,int)=NULL;
  fp=funcl
  fp(10,10);
}
*是否能理解函数名就是一个函数指针?
注意:typedef int(MY_FUNC)(int,int);代表一种函数,MY_FUNC fun;fun不是指针,是没有任何作用的。

5. 有函数指针作为形参的函数
void fun(int(*fun)(int,int) , int a , int b)// int(*fun)(int,int) 应该能写成MY_FUNC_P fun
{
  fun(a,b);
}

6. 函数模板(模板函数)

//由函数模板,生成(多个)模板函数,然后编译

C#的模板函数,是要放在类中的,而且能限定传入参数类型

class A

{

  public int CalArea<T>(T shape) where T: Shape,new() //限定T继承Shape,有无参构造函数

  {

    //T.FuctionOfShape();T能点出Shape的方法

  }  

  public string[] GetPropertyNames<T>(T model) where T:class//限定T必须是一个类

  {}

  

  public int CalV<T,I>(T shape, I vector)

  where T: Shape,new() //限定T继承Shape,有无参构造函数

  where I : Vector//限定I继承于Vector

  {

    //...

  }  

}

关键字:template

template<class T> void MySwap(T&a T&b)

{

  T temp =a;

  a=b;

  b=temp;

}

template<class T1,class T2,...>(T1& t1,T2 &t2,...)

{

  //...

}

//template<typename T>

//typename应该是和C#一样,对T的限定?经验证,这是错误的,typename也是关键字,跟C#不一样。

int main()

{

  int a=0,b=1;

  MySwap(0,1);

  //MySwap<int>(0,1);//也可以显式的指定类型

}

注意,模板函数不能自动类型转化

template<class T> int Add(T a,T b);

int main()

{

  int a=0;

  char b=‘a’;

  MySwap<int>(a,b);//错误

}

C++学习笔记2_函数.函数指针.函数模板的更多相关文章

  1. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  2. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  3. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  4. Flutter学习笔记(4)--Dart函数

    如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...

  5. Objective-C学习笔记 利用协议实现回调函数

    来源:http://mobile.51cto.com/iphone-278354.htm Objective-C学习笔记 利用协议实现回调函数是本文要介绍的内容,主要是实现一个显示文字为测试的视图,然 ...

  6. C++学习笔记(四)--指针

    1.指针(变量的地址): 指针变量:存放指针(地址)的变量 直接存取(访问):按变量地址取值 间接存取(访问):将变量的地址放入指针变量中 定义指针变量:基类型 *指针变量名 2.与指针有关的运算符: ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...

  8. GIS案例学习笔记-CAD数据分层导入现有模板实例教程

    GIS案例学习笔记-CAD数据分层导入现有模板实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 原始数据: CAD数据 目标模板 2. 任务:分5个图层 ...

  9. C++学习笔记(八):函数重载、函数指针和函数对象

    函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...

随机推荐

  1. navicat工具 pymysql模块

    目录 一 IDE工具介绍(Navicat) 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navi ...

  2. 移动端适配 rem 设置

    refresh();    window.onresize = function(){      setTimeout(function(){        refresh();      },10) ...

  3. Docker下配置nacos

    前言 近段时间在学dubbo,dubbo-admin死活装不上,无论是本地还是docker,所以把目光投向了其他配置中心,我选定的是阿里新开源的nacos. 正文 拉取镜像到本地docker dock ...

  4. Fcitx使用搜狗词库与皮肤

    在 \(\text{Linux}\) 环境下,\(\text{Fcitx}\) 确实是最好用的开源输入法之一.然而 \(\text{Windows}\) 下的巨头输入法 -- 搜狗,对 \(\text ...

  5. Ansible Roles角色

    Roles小技巧: 1.创建roles目录结构,手动或使用ansible-galaxy init test roles 2.编写roles的功能,也就是tasks. nginx rsyncd memc ...

  6. python编程基础之二十六

    偏函数:当一个函数有大量的参数时候,调用时候非常不方便,于是就可以用偏函数解决,将一些参数固定(默认值),达到简化函数调用的目的 使用偏函数需要导入functools import functools ...

  7. 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

    本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...

  8. Python:的web爬虫实现及原理(BeautifulSoup工具)

    最近一直在学习python,学习完了基本语法就练习了一个爬虫demo,下面总结下. 主要逻辑是 1)初始化url管理器,也就是将rooturl加入到url管理器中 2)在url管理器中得到新的new_ ...

  9. [Luogu2422]良好的感觉

    题目描述 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中 ...

  10. java-try,return和finally相遇时的各种情况

    今天碰到了这样一个问题:使用try,return和finally会碰到的各种情况1,try中有return时,执行顺序:2,try和finally中都有return时,执行顺序:3,运算代码在fina ...