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. BMap添加海量点数据,BMap.Point携带数据

    在开发web项目的过程中使用到了百度地图,由于要在地图中画出很多点比较影响加载速度,查看官方文档,发现有提供加载海量点的功能BMap.PointCollection,用这个加快速度,但是官方文档中提供 ...

  2. 03-Django基础概念和MVT架构

    一.Django基础 掌握Django的 MVT 架构的使用 掌握Git管理源代码 主要内容 了解Django的 MVT 架构的使用流程 使用Django完成案例 : 书籍信息管理 MVC介绍 MVC ...

  3. scrapy架构流程

    1.爬虫spiders将请求通过引擎传递给调度器scheduler 2.scheduler有个请求队列,在请求队列中拿出请求给下载器,downloader 3.downloader从Internet的 ...

  4. 如何在 Linux 和 windows 启动使用 Dubbo 和 ZK

    今天的知识点有 3 个: Linux 下安装.配置 JDK. Windows 下启启动 dubbo 和 zookeeper. Linux 下启动 dubbo 和 zookeeper. 1.Linux ...

  5. mac下安装rabbitmq

    使用homebrew安装rabbitmq,命令如下: brew install rabbitmq 安装的位置如下/usr/local/Cellar/rabbitmq/3.7.18 进入到sbin目录下 ...

  6. COGS 2510. 拯救紫萱学姐

    [题目描述] 其实在开考前半个小时题面并不是这样的. 由于明天要考试,同学们要把抽屉里的书都搬空,书很多而且办了走读不能回寝室的学长一眼就看到了回班撩他的学姐,于是就把学姐当学长用♂了:“帮我把这摞书 ...

  7. 使用Spring-boot-starter标准改造项目内的RocketMQ客户端组件

    一.背景介绍 我们在使用Spring Cloud全家桶构建微服务应用时,经常能看到spring-boot-xxx-starter的依赖,像spring-boot-starter-web.spring- ...

  8. VMware ESXI6.0服务器安装系列:RAID设置

    本文转载至http://www.scriptjc.com/article/847 1.连接显示器 2.插上键盘.U盘.显示器 3.看显示屏上的提示,按F12关机 4.关机前输入密码,然后按回车键 更换 ...

  9. java位运算,逻辑运算符

    位运算逻辑运算符包括: 与(&),非(~),或(|),异或(^). &:  条件1&条件2  ,只有条件1和条件2都满足, 整个表达式才为真true,  只要有1个为false ...

  10. unittest中diascover批量执行用例

    # case_dir='./'#当前脚本的路径 # discover=unittest.defaultTestLoader.discover(case_dir,pattern='unittest_fr ...