7、函数

概述

作用:将一段经常使用的代码封装起来,减少重复代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。

函数的定义

类似于java的方法定义,只不过没有修饰符

函数的定义一般主要有5个步骤:

1、返回值类型

2、函数名

3、参数表列

4、函数体语句

5、return 表达式

语法

返回值类型/void 函数名 (参数列表){
   函数体语句
   return表达式
}

函数的定义和调用

#include<iostream>
using namespace std;
/*
	定义函数
	功能:将a和b相加并返回
*/
int add(int a,int b) {
	return a + b;
}

int main() {
	//调用函数
	cout << add(1, 2) << endl; //3

	system("pause");
	return 0;
}

值传递

值传递,就是函数调用时实参将数值传入给形参,和java中不一样,函数传递的是值,而不是引用

例子:

#include<iostream>
using namespace std;
#include<string>
/*
	作用,在a前面添加“你好”
*/
string strEnable(string a) {
	a = "你好" + a;
	return a;
}


int main() {
	
	string name = "lucy";
	
	string msg = strEnable(name);

	cout << msg << endl; // 你好lucy
	cout << name << endl; // lucy,入参的name没有发生改变

	system("pause");
	return 0;
}

函数的声明

告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

函数的声明可以多次,但是函数的定义只能有一次

#include<iostream>
using namespace std;

int add(int a, int b);
// 提前告诉编译器,函数add存在,不会再编译时报错
int add(int a, int b);

int main() {
	cout << add(1, 5) << endl;
	system("pause");
	return 0;
}

int add(int a, int b) {
	return a + b;
}

函数分文件编写

作用:让代码结构更加清晰

函数分文件编写一般有4个步骤

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在.h头文件中写函数的声明
  4. 在.cpp源文件中写函数的定义

例子:

1、声明头文件add.h

#include<iostream>

//声明函数
int add(int a,int b);

2、声明源文件add.cpp

//声明关联哪一个头文件
#include"add.h"

//定义函数
int add(int a, int b) {
	return a + b;
}

3、在需要使用函数的源文件中引入

#include<iostream>
#include"add.h" //引入自己定义的头文件
using namespace std;

int main() {
	//使用函数
	cout << add(1, 2) << endl;

	system("pause");
	return 0;
}

函数的默认参数

在C++中,函数的形参列表中的形参是可以有默认值的。

语法: 返回值类型 函数名 (参数= 默认值){}

例子:

注意:默认参数必须在形参列表结尾

#include<iostream>

using namespace std;

void test(int a,int b = 10,int c = 20) {
	int count = a + b + c;
	cout << count << endl;
}

int main() {
	test(30); // 60
	test(30, 30); // 80
	test(30, 30, 30); // 90
	return 0;
}

注意:如果函数声明的时候有默认参数,那么实现的时候不可以有默认参数

#include<iostream>

using namespace std;

void test(int a, int b = 10, int c = 20);

void test(int a, int b, int c) {
	int count = a + b + c;
	cout << count << endl;
}

int main() {
	test(30); // 60
	test(30, 30); // 80
	test(30, 30, 30); // 90
	return 0;
}

函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法返回值类型 函数名 (数据类型){}

例子:

#include<iostream>

using namespace std;

void test(int a, int) {
	cout << a << endl;
}


int main() {
	test(10, 10);
	return 0;
}

占位参数也可以有默认值

#include<iostream>

using namespace std;

void test(int a, int = 10) {
	cout << a << endl;
}


int main() {
	test(10);
	return 0;
}

函数的重载

作用:函数名可以相同,提高复用性

函数重载满足条件

//函数重载需要函数都在同一个作用域下
void func(){
	cout << "func 的调用!" << endl;
}
void func(int a){
	cout << "func (int a) 的调用!" << endl;
}
void func(double a){
	cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b){
	cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b){
	cout << "func (double a ,int b)的调用!" << endl;
}

int main() {

	func();
	func(10);
	func(3.14);
	func(10,3.14);
	func(3.14 , 10);
	
	system("pause");

	return 0;
}

函数重载的注意事项

1、引用作为函数参数

#include<iostream>

using namespace std;

void test(int & a) {
	cout << "no-const" << endl;
}
void test(const int & b) {
	cout << "const" << endl;
}

int main() {
	int a = 10;
	test(a); // no-const
	test(10); // const
	return 0;
}

2、函数有默认参数

#include<iostream>

using namespace std;

void test(int a) {
	cout << "no-default" << endl;
}
void test(int a,int b = 10) {
	cout << "default" << endl;
}

int main() {
	int a = 10;
	test(a); // 出现二义性,编译器会报错
	return 0;
}