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. 使用Ingress来负载分发微服务

    目录 使用Ingress来负载分发微服务  Demo规划  准备Demo并完成部署  创建部署(Deployment)资源  创建服务(Service)资源  创建Ingress资源并配置转发规则  ...

  2. php数字函数

    is_numeric() 检查变量是否包含一个合法数字 round()  取整数,四舍五入 round(数字, 小数位) ceil()  向上取整 floor() 向下取整 range()  生成范围 ...

  3. 究竟是.NET淹没在汪洋大海,还是人心的浮躁、见识的短浅?

    这些年来有相当多的.net开发者转了其他语言,也有一部分是迫不得已因为公司的转型而转,其中也有一大部分觉得.net没前途性能不好比某些语言性能差.还有一部分会说出一些名词去指责.net说他做不到,其实 ...

  4. Java匹马行天下之教你用学汉语式方法学编程语言

    Java匹马行天下之教你用学汉语式方法学编程语言 前言: 前段时间接连更新了带小白从入门到了解的几篇博客: <Java匹马行天下之编程常识知多少> <Java匹马行天下之走进编程的殿 ...

  5. Windows下IIS搭建Ftp服务器

    第一步:启用Windows IIS Web服务器 1.1 控制面板中找到"程序"并打开 1.2 程序界面找到"启用或关闭Windows功能"并打开 1.3 上面 ...

  6. LeetCode_232-Implement Queue using Stacks

    题意是使用栈实现队列:队列是先进先出,后进后出. class MyQueue { public: /** Initialize your data structure here. */ MyQueue ...

  7. 利用Helm简化Kubernetes应用部署(2)

    目录 定义Charts  使用Helm部署Demo  Helm常用操作命令  定义Charts 回到之前的“charts”目录,我们依次进行解读并进行简单的修改. Chart.yaml 配置示例: a ...

  8. [USACO17JAN]Building a Tall Barn建谷仓

    题目描述 Farmer John is building a brand new, NNN -story barn, with the help of his KKK cows ( 1≤N≤K≤101 ...

  9. phpfpm的原理是什么?

    php-fpm是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似.master进程主要负责CGI及PHP环境初始化.事件监听.子进程状态等等,worker进程负责处理 ...

  10. windows 抓hash获取管理员密码

    webshell 找能执行权限的目录上传 C:\Windows\System32\config\sam 内有windows 密码 利用工具把密码抓出来 samcopy 直接抓取 GetHASHES.e ...