C++学习笔记2_函数.函数指针.函数模板
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_函数.函数指针.函数模板的更多相关文章
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- Flutter学习笔记(4)--Dart函数
如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...
- Objective-C学习笔记 利用协议实现回调函数
来源:http://mobile.51cto.com/iphone-278354.htm Objective-C学习笔记 利用协议实现回调函数是本文要介绍的内容,主要是实现一个显示文字为测试的视图,然 ...
- C++学习笔记(四)--指针
1.指针(变量的地址): 指针变量:存放指针(地址)的变量 直接存取(访问):按变量地址取值 间接存取(访问):将变量的地址放入指针变量中 定义指针变量:基类型 *指针变量名 2.与指针有关的运算符: ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...
- GIS案例学习笔记-CAD数据分层导入现有模板实例教程
GIS案例学习笔记-CAD数据分层导入现有模板实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 原始数据: CAD数据 目标模板 2. 任务:分5个图层 ...
- C++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
随机推荐
- SpringBoot返回JSON
目录 1.SpringBoot返回JSON简介 2.整合jackson-databind 3.整合Gson 4.整合fastjson 1.SpringBoot返回JSON简介 随着web开发前后端分离 ...
- .net core 3.0 WPF中使用FolderBrowserDialog
前言 随着.net core 3.0 的发布,WPF 也可以在 core 平台上使用了.当前的 WPF 不支持跨平台,仅能够在 Windows 平台上使用.如果想体验 WPF 跨平台开发,可以访问开源 ...
- 介绍ArcGIS中各种数据的打开方法——tin(栅格文件)
4.加载栅格文件 栅格数据是GIS中重要的数据源之一,如卫星图像.扫描的地图.照片等. 栅格数据常见的格式有Bmp.Tiff.Jpg.Grid等. 添加栅格数据主要使用Rasterlayer 组件类, ...
- java集合之linkedList链表基础
LinkedList链表: List接口的链接列表实现.允许存储所有元素(包含null).使用频繁增删元素. linkedList方法: void addFirst(E e) 指定元素插入列表的开头 ...
- opencv::Laplance算子
Laplance算子 理论:在二阶导数的时候,最大变化处的值为零即边缘是零值.通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘. 拉普拉斯算子(Laplance operator) 处理 ...
- Logstash 入门
一.简介 Logstash 是开源的服务器端数据处理管道,支持从不同来源采集数据,装换数据,并将数据发送到不同的存储库中. Logstash 项目诞生于 2009 年 8 月 2 日.其作者是世界著名 ...
- H5实现图表和地图
H5实现图表和地图的代码如下: <!DOCTYPE html> <html> <head> <title>图表和地图</title> < ...
- 百万年薪python之路 -- 并发编程之 多线程 三
1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. 非阻塞: 进程没有遇到IO 当进程遇到IO, ...
- 音视频入门-12-手动生成一张PNG图片
* 音视频入门文章目录 * 预热 上一篇 [PNG文件格式详解]详细介绍了 PNG 文件的格式. PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDA ...
- C# 中yield关键字解析
前言 前段时间了解到yield关键字,一直觉得还不错.今天给大家分享一下yield关键字的用法.yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素.具体如何使用yi ...