c++第三课--函数

1、内联函数 --inline
内联函数是C++用来代替宏代码片段,避免宏的副作用

#include <iostream>
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))  
inline int myfunc(int a, int b)
{
	return a < b ? a : b;
}
int main(void)
{
	int a = 1;
	int b = 5;
	int c = myfunc(++a, b);  //第一种情况
	//int c = MYFUNC(++a, b); //第二种情况
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
}

第一种情况:
在这里插入图片描述
第二种情况:
在这里插入图片描述
第二种情况等价于(++a)<b?(++a):b,(注:如果b是0,那么得到的结果是2,0,因为直接返回b,不执行++a)。
小结:
内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求内联函数由 编译器处理,直接将编译后的函数体插入调用的地方宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程。内联函数在编译时直接将函数体插入函数调用的地方,inline只是一种请求,编译器不一定允许这种请求,内联函数省去了普通函数调用时压栈,跳转和返回的开销 。

2、c++函数允许默认参数

void printAB(int x = 3)
{
	printf("x:%d\n", x);
}

## **//在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数**

void printABC(int a, int b, int x = 3, int y=4, int z = 5)
{
	printf("x:%d\n", x);
}
int main62(void)
{
	printAB(2);
	printAB();
	system("pause");
	return 0;
}

3、函数占位参数

#include <iostream>
int func(int a, int b, int)
{
	return a + b;
}
int main()
{
	//func(1,2); //必须三个参数,虽然第三个参数是占位参数
	printf("func(1, 2, 3) = %d\n", func(1, 2, 3));
	return 0;
}

4 默认参数和占位参数

int func2(int a, int b, int = 0)
{
	return a + b;
}
void main()
{
	//如果默认参数和占位参数在一起,都能调用起来
	func2(1, 2);
	func2(1, 2, 3);
	system("pause");
}

意义:C++可以声明占位符参数,占位符参数一般用于程序扩展和对C代码的兼容

5、函数重载
定义:用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同
函数重载至少满足下面的一个条件:
1、参数个数不同
2、参数类型不同
3、参数顺序不同
(注:函数返回值不是函数重载的判断标准)

#include<iostream>
int func(int x)
{
	return x;
}
/*  函数返回值不是函数重载的判断标准
double func(int x)
{
	return x;
}
*/
int func(int a, int b)
{
	return a + b;
}
int func(const char* s)
{
	return strlen(s);
}
int main()
{
	int c = 0;
	c = func(1);
	printf("c = %d\n", c);
	c = func(1, 2);
	printf("c = %d\n", c);
	c = func("12345");
	printf("c = %d\n", c);
	printf("Press enter to continue ...");
	getchar();
	return 0;
}

重载与默认参数

#include<iostream>
int func(int a, int b, int c = 0)
{
	return a * b * c;
}
int func(int a, int b)
{
	return a + b;
}
//1个参数的允许吗
int func(int a)
{
	return a + b;
}
int main()
{
	int c = 0;
	c = func(1, 2); // 存在二义性,调用失败,编译不能通过 
	printf("c = %d\n", c);
	printf("Press enter to continue ...");
	getchar();
	return 0;
}

函数重载和函数指针结合
/*
函数重载与函数指针
当使用重载函数名对函数指针进行赋值时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
*/

int func(int x) // int(int a)
{
	return x;
}
int func(int a, int b)
{
	return a + b;
}
int func(const char* s)
{
	return strlen(s);
}
typedef int(*PFUNC)(int a); // int(int a)
int main()
{
	int c = 0;
	PFUNC p = func;
	c = p(1);
	printf("c = %d\n", c);
	printf("Press enter to continue ...");
	getchar();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值