目录

1、分文件编写

2、防止头文件重复包含

3、指针变量作为函数的参数

4、指针作为函数返回值类型

5、函数和数组

6、函数和字符串

7、递归

8、引用作为函数参数

9、内联函数inline

10、函数重载

11、extern "C"的用法


1、分文件编写

在C++开发的项目中,通常都是需要多文件编写的。

分文件编写的思想:函数的定义在单独的.cpp文件中,函数的声明在对应的.h中

//math.h
#ifndef _MATH_H_
#define _MATH_H_int add(int,int);
int sub(int,int);
int div(int,int);#endif
//math.cpp
#include "math.h"
int add(int a,int b)
{return a+b;
}
int sub(int a,int b)
{return a-b;
}
int div(int a,int b)
{return a/b;
}
//main.cpp
#include <iostream>
#include "math.h"
using namespace std;
int main()
{int x=23;int y=12;cout<<"x+y="<<add(x,y)<<endl;return 0;
}

linux中执行命令:g++ *.cpp,然后回车就会出现一个a.out的可执行文件,紧接着输入命令./a.out就可以输出结果。

2、防止头文件重复包含

由于在不知情的情况下,很有可能会将头文件重复包含,重复包含的坏处就是如果包含的文件中有定义的变量,那么就会报“重复定义”的错误。

C++重复包含头文件,编译器拷贝和扫描需要耗费时间,降低效率;

那么怎么解决这个问题呢?

使用#ifndef #define #endif

举例说一下他们的意思:

#ifndef _FUNC_H_  //_FUNC_H_没有定义过了吗?
#define _FUNC_H_  //如果没有,则开始定义要写的内容#endif   //结束标志位

3、指针变量作为函数的参数

1)通过普通变量在函数内部修改普通变量的值,是不能修改的

void func(int num)
{num=100;}
int main()
{int a=9;func(a);cout<<"a="<<a<<endl;//9}

2)如果想要通过函数内部修改外部变量的值,需要传递外部变量的地址

void func(int *p)
{*p=100;
}
int main()
{int a=10;func(&a);//地址指向了pcout<<"a="<<a<<endl;//100return 0;}

4、指针作为函数返回值类型

不要返回局部变量的地址,因为局部变量当函数调用完毕以后会自动释放内存。

int num=0;//定义全局变量
int *get()
{return &num;
}//*****************************************************int *get1()
{int a=10;  //定义局部变量return &a;
}
int main()
{cout<<"*get1()="<<*get1()<<endl;cout<<"*get1()="<<*get1()<<endl;cout<<"*get1()="<<*get1()<<endl;
}

 

通过运行就会看出,定义局部变量就会提醒错误。

执行时还会报段错误

5、函数和数组

编译器会将数组参数转成  指针类型的变量,用于接收数组首元素的地址。

void func(int arr[])  //优化成  int *p
{cout<<sizeof(arr)<<endl;
}

6、函数和字符串

字符串的三种表示形式:char数组、字符串常量、char *

int charCount(const char* str,char c)
{cout<<"*str="<<*str<<endl;//只输出字符串的第一个字符cout<<"str="<<str<<endl;//输出字符串的全部字符int count=0;//记录c出现的次数while(*str){if(*str == c){count++;}str++;}return count;
}
int main()
{char arr[15] = "lllhelllo";const char* str="lllhelllo";int n1=strlen(arr);//专门记录字符串的长度 9int n2=strlen(str);//9int count=charCount(arr,'l');cout<<count<<endl;}

7、递归

函数定义中调用函数本身,称为递归

解决思路:拆分和合并

注意:递归一定要有出口,不然会产生死递归,stack overflow栈溢出

还有递归的次数不能过多

int func(int n)
{if(n==1)return n;elsereturn n*func(n-1);
}
int main()
{int n=func(5);return n;
}

8、引用作为函数参数

函数参数传递的方式有3种:1、值传递        2、地址传递       3、引用传递

1、按值传递
void value(int x,int y)
{int temp=x;x=y;y=temp;
}
2、按地址传递
void pointer(int *x,int *y)
{int temp=*x;*x=*y;*y=temp;
}
3、按引用传递
void reference(int &x,int &y)
{int temp=x;x=y;y=temp;
}
int main()
{int a=20;int b=30;//value(a,b);//pointer(&a,&b);//reference(a,b);cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;return 0;}

通过观察发现,值传递并没有交换a与b的值,因为值传递是不能通过函数外部来改变函数内部的值的,因为他们的地址没有发生根本性的改变。而按地址传递和引用传递交换了a与b的值,因为他们的地址内的数值发生了改变。

9、内联函数inline

函数底层不用做进栈出栈的操作,直接去运行函数内部的操作。适用于量级非常小的函数使用。

注意:不能存在任何形式的循环语句,不能存在过多的条件判断语句,不能对函数进行取地址操作。不一定所以的带inline都可以进行内联操作。

inline int fun()
{cout<<"i'm fun..."<<endl;
}
int main()
{fun();// 直接用这个语句cout<<"i'm fun..."<<endl去替换当前的语句return 0;
}

10、函数重载

函数重载是在C++语言在C语言的基础上新增的功能。函数重载能够在程序中使用多个同名的函数。

函数重载的关键是函数的参数列表(函数特征标)。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则他们的特征标也相同,而与变量名无关。

C++允许定义名称相同的函数,条件是他们的函数特征标不同。如果参数数目、参数类型、排列顺序不同,则特征标也不同。

#include <iostream>
using namespace std;void fun()
{cout<<"0"<<endl;
}
void fun(int a)
{cout<<"1"<<endl;
}
void fun(int a,int b)
{cout<<"2"<<endl;
}
void fun(double a,int b)
{cout<<"3"<<endl;
}
int main()
{fun();fun(12);fun(12.34,90);return 0;
}

再次声明:函数重载的条件:C++下允许使用函数名相同

1、在相同的作用域下;

2、参数的个数,类型,排列顺序必须不同;

3、函数的返回值不可以作为函数重载的条件。

11、extern "C"的用法

只要被extern "C"所修饰的代码都会按照C语言的方式去编译

还是拿上一个程序做例子

#include <iostream>
using namespace std;extern "C" void fun()
{cout<<"0"<<endl;
}
extern "C" void fun(int a)//报错
{cout<<"1"<<endl;
}
extern "C" void fun(int a,int b)//报错
{cout<<"2"<<endl;
}
extern "C" void fun(double a,int b)//报错
{cout<<"3"<<endl;
}
int main()
{fun();fun(12);fun(12.34,90);return 0;
}

我们会发现加上extern "C"后程序会报错函数名重复的错误,因为C语言中没有函数重载的功能,只有C++中有。

那么它有什么作用呢?当我们进行C语言和C++语言混合编程的时候就派上用场了。

//  math.h
#ifndef _MATH_H_
#define _MATH_H_int add(int,int);
int sub(int,int);
int multi(int,int);#endif _MATH_H_
//math.c
#include "math.h"
int add(int a,int b)
{return a+b;
}
int sub(int a,int b)
{return a-b;
}
int multi(int a,int b)
{return a*b;
}
//main.cpp
#include <iostream>
using namespace std;
extern "C" {#include "math.h"
}int main()
{int sum=add(23,12);cout<<"sum="<<sum<<endl;return 0;
}

【C++碎碎念】函数相关推荐

  1. 前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序

    『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到. 我会查阅一些资料并可能加上自己的理解,来记录这些问题.更多文章请前往我的个人博客 ...

  2. 数据结构碎碎念(一)

    碎碎念 在大一学习C语言的时候,举过一个用栈实现的括号匹配算法,当时觉得很难,不过现在回顾起来,这个算法也算是比较简单的一个关于栈的应用了.而现在所常见的算法问题也都是什么中缀表达式转后缀表达式,双栈 ...

  3. Rust 与服务端编程的碎碎念

    Rust 与服务端编程的碎碎念 https://zhuanlan.zhihu.com/p/30028047 Rust 是 Mozilla 推出的一门系统编程语言,非常看重内存安全,是一门非常优秀的语言 ...

  4. 2022年电设省赛碎碎念【C题小车题省一】

    一些备赛的时间轴 碎碎念 前期准备 为期20天的培训 图形获取和指示系统 智能小车 自动行驶小车 省赛 写在最后 碎碎念 电赛准备主要集中在七月份,前前后后做了三道题就直接比赛了.我们的准备确实很充分 ...

  5. 【BUAA_CO_LAB】计组p2碎碎念

    计组p2碎碎念 // 上机后补充:本次上机的三道编程题分别是[删除一个数字中的某些位,输出最小的可能值(提供了C代码)].[分解自然数n为x1 + x2 + -的形式并按字典序输出(提供了C代码)]. ...

  6. 机器学习系列(23)_SVM碎碎念part6:对偶和拉格朗日乘子

    原文地址:SVM - Understanding the math - duality-lagrange-multipliers/ by Brandon Amos 感谢参与翻译同学:@Fox & ...

  7. 参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...

    上周末去清华建筑学院开了个会,叫做海峡两岸城市地理信息系统论坛2010 年会,主题很大,但是内容比较集中一些,就是围绕着GIS与城市规划.一天下来听了20个报告,挺佩服主办方的时间控制,这么密集的报告 ...

  8. Jerry的碎碎念:SAPUI5, Angular, React和Vue

    2019独角兽企业重金招聘Python工程师标准>>> 去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5 ...

  9. PMcaff写给大家的年终碎碎念 PMcaff | 记录

    今天是大年三十,2014马上就要结束了,送上新春祝福之前,碎碎念的小希有话想跟大家说. 瞧这一年 小米在硬件行业继续如鱼得水,科幻片里的智能家居生慢慢变成生活. 阿里巴巴在纳克达斯扬眉吐气了一把,一夜 ...

  10. 机器学习碎碎念:霍夫丁不等式

    点击上方"AI有道",选择"设为星标" 关键时刻,第一时间送达! 红色石头每天碎碎念一些机器学习知识和概念,大家一起学习,每天进步一点点!喜欢的话别忘了文末点赞 ...

最新文章

  1. java basicstroke_使用java.awt.BasicStroke动画化虚线
  2. java中所有的类都继承于_Java中所有的类都是通过直接或间接地继承( )类得到的...
  3. poi 默认2位小数_odoo小数精确度
  4. KeyMob应用开发者服务平台帮助开发者推广和盈利
  5. codeforces1494 D. Dogeforces(构造)
  6. resteasy 统一异常_RESTEasy教程第3部分:异常处理
  7. 在Hotspot JVM中跟踪过多的垃圾回收
  8. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()
  9. 高通最强芯片855发布!AI性能比华为苹果翻倍,商用5G,标配屏下指纹
  10. 「leetcode」617. 合并二叉树:【三种递归】【一种迭代】详解
  11. Atitit 登录模块常见的安全措施条例与攻击行为表 目录 1. 安全目标 1 2. 常见安全措施 2 2.1. 修改密码需要验证员密码 2 2.2. 密码Salt加盐机制 2 2.3. Sql防注
  12. google 手机号码校验库libphonenumber
  13. 概率论 方差公式_2020考研数学:概率论各章节知识点梳理
  14. Android VideoView 循环播放视频
  15. 眼镜的基础知识与挑选
  16. 快播关闭服务器,你怎么看?
  17. 我是这样被电麻的:电容降压电路使用和注意事项
  18. 三,python基础初识。
  19. GPU驱动及CUDA安装流程介绍
  20. 成为大数据工程师需要具备什么能力?发展前景好么

热门文章

  1. @优秀的你!CSDN高校俱乐部主席招募!
  2. 美国商会呼吁对ICO进行澄清
  3. .spring 知识点总结
  4. 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。
  5. 一切都结束了,祝贺曼联夺得联赛冠军
  6. 海底捞市值超大多数上市房企,火锅是怎么做到比卖房还赚钱的?
  7. 2022出海中东:沙特阿拉伯电商市场现状及发展前景
  8. nagios利用fetion发送报警
  9. java源码怎么使用,系列篇
  10. 2021-2027全球与中国针叶樱桃提取物市场现状及未来发展趋势