作用:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
类似于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、声明头文件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;
}
#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;
}
#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;
}