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. SpringBoot返回JSON

    目录 1.SpringBoot返回JSON简介 2.整合jackson-databind 3.整合Gson 4.整合fastjson 1.SpringBoot返回JSON简介 随着web开发前后端分离 ...

  2. .net core 3.0 WPF中使用FolderBrowserDialog

    前言 随着.net core 3.0 的发布,WPF 也可以在 core 平台上使用了.当前的 WPF 不支持跨平台,仅能够在 Windows 平台上使用.如果想体验 WPF 跨平台开发,可以访问开源 ...

  3. 介绍ArcGIS中各种数据的打开方法——tin(栅格文件)

    4.加载栅格文件 栅格数据是GIS中重要的数据源之一,如卫星图像.扫描的地图.照片等. 栅格数据常见的格式有Bmp.Tiff.Jpg.Grid等. 添加栅格数据主要使用Rasterlayer 组件类, ...

  4. java集合之linkedList链表基础

    LinkedList链表: List接口的链接列表实现.允许存储所有元素(包含null).使用频繁增删元素. linkedList方法: void addFirst(E e) 指定元素插入列表的开头 ...

  5. opencv::Laplance算子

    Laplance算子 理论:在二阶导数的时候,最大变化处的值为零即边缘是零值.通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘. 拉普拉斯算子(Laplance operator) 处理 ...

  6. Logstash 入门

    一.简介 Logstash 是开源的服务器端数据处理管道,支持从不同来源采集数据,装换数据,并将数据发送到不同的存储库中. Logstash 项目诞生于 2009 年 8 月 2 日.其作者是世界著名 ...

  7. H5实现图表和地图

    H5实现图表和地图的代码如下: <!DOCTYPE html> <html> <head> <title>图表和地图</title> < ...

  8. 百万年薪python之路 -- 并发编程之 多线程 三

    1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: ​ 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. ​ 非阻塞: 进程没有遇到IO 当进程遇到IO, ...

  9. 音视频入门-12-手动生成一张PNG图片

    * 音视频入门文章目录 * 预热 上一篇 [PNG文件格式详解]详细介绍了 PNG 文件的格式. PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDA ...

  10. C# 中yield关键字解析

    前言 前段时间了解到yield关键字,一直觉得还不错.今天给大家分享一下yield关键字的用法.yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素.具体如何使用yi ...