【c++】函数/内联函数/函数的重载/缺省/指针函数/函数指针

本文详细介绍了C++中的函数概念,包括函数的定义、调用、参数传递方式,特别是内联函数、函数重载、缺省参数和指针函数的用法。此外,还提到了引用的概念及其与指针的区别,并讨论了递归和控制台输出颜色的修改。最后,阐述了头文件的引用和项目文件管理。

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) = &sum;
	//类型 变量名;
	Pfunc pfunc = &sum;//等同于上一句

----------------------------------
递归:函数直接或者间接调用自己;
  递推:函数调用的流程;
  回推:函数返回的流程;
    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:函数的定义/全局变量的定义

项目文件管理:在项目文件夹中(引用头文件以项目文件为标准)
筛选器:解决方案资源管理器中(与上没有联系,与项目文件夹关系保持一致)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值