1.函数:封装一个功能模块;例如:求字符串长度/比较两个数的大小
2.定义:
返回值类型 函数名(形参表)//形参表:类型1 变量名1,类型2 变量2…类型n 变量名n
{
函数体;
}//不能省略
形参表:原材料
返回值:成品
根据返回值:
1.无返回值(返回值类型:void)
1.可以不写 2.return;//(表示函数结束)
2.带返回值(返回值类型:整型/浮点型/字符型/布尔型/指针类型等)
return 表达式;
根据形参表:
1.无形参:()
2.带形参:
(int a,int b);
(int* pa,int* pb);
(int a[10]);
(int(p)[4],int size);
(const int a,const int pa);
3.调用:函数名(实参表);//实参表:表达式1,表达式2…表达式n//例如(a,b),(1,2)
1.实参表必须与形参表数量,类型,顺序完全一致;
2.检测:形参 = 实参;//int a = a;//int a = 3;
1.写在主调函数内,作为单独语句使用,例如:sum(1,2);//求1+2的和
2.有返回值时,作为赋值运算符的右值,例如int c = sum(a, 2);
3.有返回值时,还可以作为实参使用;
4.声明(在使用一个函数前,查找是否有该函数的声明或者定义)
函数头:返回值类型 函数名(形参表);
.h:头文件(函数的声明)(声明可以多次)
.cpp:源文件(函数的定义)(定义只能一次,否则就是重定义)
(.h和.cpp文件名字尽量相同)
5.调用流程:
1.从主调函数进入被调函数
2.给形参分配临时内存,将实参的值拷贝(赋值)给形参
3.执行函数体,有返回值则返回返回值
4.函数调用结束,回收局部变量和形参的临时内存,回到主调函数
6.参数传递的方式:
1.值传递:将实参的值直接拷贝给形参(不能通过形参改变实参的值)
2.址传递:1.实质也是一种值传递;
2.通过地址找到指向的内容改变值;
(可以改变实参的值)
3.引用传递:形参是实参的别名,改变形参就会改变实参;
特殊的形参:
1.一维数组(会被弱化成指针)
int n[5];//5不代表数组大小
int n[];
int* pn;
int* pn,int size;//推荐(指定大小)
2.二维数组(会被弱化成数组指针)
int n[3][4];
int n[][4];//省略行大小,不能省略列大小
int(*p)[4];
int(*p)[4],int row;//数组指针,行数
3.被const修饰的形参:(增强程序的稳定性)
1.const修饰普通变量;const int a;
(不能修改形参的值)
2.const修饰指针:指针常量
(指针不能改变指向)
const修饰指向的内容:常量指针
(不能修改指针指向的内容)
3.const修饰引用:常引用
(不能通过形参修改实参的值)
特殊的返回值:
1.不能返回栈区的地址或者引用
7.引用:给一个变量取别名,与这个变量共享一段内存;
1.在定义时:类型& 别名 = 变量名;
2.单目运算符:&取地址
3.双目运算符:按位与
特点:1.必须初始化
2.不能改变指向
3.既可以作为左值,也可以作为右值;
8.指针和引用的区别:
1.指针可以不初始化,引用必须初始化;
2.指针可以改变指向,引用不能改变指向;
3.指针可以为空,引用不能为空;
4.指针有独立的内存,引用与被引用对象共享一段内存;
----------------------------------
函数:优点:1.代码量减少 2.逻辑清晰
缺点:查找函数,时间上的消耗;
对于短小(没有循环)且频繁使用的函数:
C语言:宏定义
1.宏定义:#define 宏名 值
2.宏定义函数:#define 函数名(形参表:没有类型) 函数体
1.整体意识,宏定义就是宏替换,打()
2.形参不需要类型,可以传递任意类型
3.形参可以为数据类型
4.有多行时,使用\表示换行(\必须紧跟换行)
#define SUM(a,b) (a)+(b)
#define POW(a) (a)*(a)
#define MAX(x,y) (x)>(y)?(x):(y)
//申请n个type类型的内存
#define NEWOUT(type,n) new type[n]
//2! = 2*1
#define Fact(n) \
int s = 1; \
for(int i = n;i > 0;i--)\
s = s*i;
C++:内联函数
1.在函数定义前加上inline关键字;
2.在调用内联函数的地方,编译时直接整体替换;
3.以空间换取时间;
inline int sum(int a, int b)
{
return a + b;
}
----------------------------------
1.函数的重载:函数名相同,但形参表不同(类型/个数/顺序至少一者不同)
(C++中:函数编译后,函数名_形参类型1_形参类型2)
1.低精度可以转换为高精度
2.返回值可以不同,但是不能以返回值类型区分重载函数;
2.函数的缺省:形参具有默认的实参值
1.写法:返回值 函数名(类型 变量名 = 默认值);
2.调用:1.省略实参:形参以默认的实参值为准
2.传递实参:实际的实参覆盖默认的实参值
3.缺省的顺序:有多个参数时,从右往左缺省
4.缺省写在函数声明中
3.指针函数:返回值为指针的函数;
函数指针:表示指针指向一个函数(函数有内存地址的)
1.定义:
返回值类型(*函数指针名)(形参表:不需要形参变量名);
2.赋值和初始化(不要添加函数调用的括号())
1.函数名的地址
2.函数名(等同于第一种方式)
3.通过函数指针调用函数
1.(*函数指针)(实参表);
2.函数指针(实参表);//推荐
//指定从大到小或者从小到大
void sort(int* n, int size,bool(*func)(int,int))
{
for (int i = 1; i < size;i++)
{
for (int j = 0; j < size - i;j++)
{
if (func(n[j], n[j + 1]))//n[j] > n[j + 1]
{
n[j] = n[j] ^ n[j + 1];
n[j + 1] = n[j] ^ n[j + 1];
n[j] = n[j] ^ n[j + 1];
}
}
}
}
bool compareBig(int a,int b)
{
return a > b;
}
bool compareSmall(int a, int b)
{
return a < b;
}
int main()
{
int n[5] = { -1, 0, 3, 10, 4 };
sort(n, 5, compareBig);
}
//给类型取别名:将 typedef 关键字去掉(看什么类型)
typedef int(*Pfunc)(int, int); //给函数指针类型取别名:Pfunc
typedef int I;//I是int类型的别名
typedef int(*PArray)[4];
int(**p)[4]; //PArray* p;
int(*p[5])[4];//PArray p[5];
I i;//等同于int i;
int(*pfunc)(int, int) = ∑
//类型 变量名;
Pfunc pfunc = ∑//等同于上一句
----------------------------------
递归:函数直接或者间接调用自己;
递推:函数调用的流程;
回推:函数返回的流程;
1.跳出条件:
2.规律:
----------------------------------
修改C++控制台输出字体的颜色:
#include <windows.h>//1.
using namespace std;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);//2.
#define _Purple SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define _White SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
//前景色:
//FOREGROUND_RED;
//FOREGROUND_GREEN;
//FOREGROUND_BLUE;
//FOREGROUND_INTENSITY;//加亮
//FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY; //紫色
//背景色:BACKGROUND_BLUE;
_Purple; cout << fab(5) << endl;
_White; cout << peach(1) << endl;
----------------------------------
引用项目中的头文件:
1. “”:
2. 引用带路径的头文件:“文件夹/文件夹/文件名”
3. 引用上一层路径下的文件:"…/"
//防止头文件被重复引用
//1.
#pragma once(#预编译处理)
//2.
#ifndef _HERO_ //如果没有定义_HERO_
#define _HERO_ //定义
#endif //结束判断
---------------
.h:函数的声明/全局变量的声明(extern)/宏定义(可以被重复定义,后面的覆盖前面的)/结构体类型的定义(加预编译处理,防止被重复定义)
.cpp:函数的定义/全局变量的定义
项目文件管理:在项目文件夹中(引用头文件以项目文件为标准)
筛选器:解决方案资源管理器中(与上没有联系,与项目文件夹关系保持一致)
本文详细介绍了C++中的函数概念,包括函数的定义、调用、参数传递方式,特别是内联函数、函数重载、缺省参数和指针函数的用法。此外,还提到了引用的概念及其与指针的区别,并讨论了递归和控制台输出颜色的修改。最后,阐述了头文件的引用和项目文件管理。
5159

被折叠的 条评论
为什么被折叠?



