1、函数的声明和定义
在复杂的程序中,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿。
把任务分工到其它的函数中,main函数只负责程序的核心流程,具体的任务由其它函数完成。
这种思想就是模块化编程。
声明和定义函数的语法:
返回值的数据类型 函数名(参数一的数据类型 参数一, 参数二的数据类型 参数二,……)
{
实现函数功能的代码。
return 返回值;
}
函数的声明:让编译器知道函数的存在,包括返回值的数据类型、函数名和参数列表。
函数的定义:函数的实现过程。
注意:
(1)函数的声明和定义可以书写在一起,也可以分开,如果书写在一起,一般放在main函数的上面,如果分开,一般在main函数的上面声明,在main函数的下面定义。
(2)如果函数的声明和定义分开书写,函数的声明后面一定要有分号,函数的定义后面一定不能写分号。
(3)在同一个程序中,函数只需要声明和定义一次,也可以多次声明,但只能定义一次。
(4)函数的声明必须和函数的定义一致(返回值的数据类型、函数名和参数列表),如果函数名和参数列表不同,表示它们不是同一个函数。
(5)return语句返回值的数据类型必须与函数的声明一致。
(6)在函数体中,return语句可以多次使用。
(7)如果函数的重点是实现功能,不关心返回值,返回值的数据类型填void,return语句后面就空着。
(8)函数可以没有任何参数。
(9)函数名是标识符,必须满足标识符的命名规则。
(10)在函数的声明和函数的定义中,参数命名可以不同,但是没必要这么书写。
#include <iostream>
using namespace std;
//函数的声明和定义分开书写,声明需要放在main函数的上面
int fun1(); //如果函数的声明和定义分开书写,函数的声明后面一定要有分号
//如果函数的声明和定义书写在一起,一般放在main函数的上面
int fun2()
{
return 2;
}
//函数的声明必须和函数的定义一致(返回值的数据类型、函数名和参数列表),如果函数名和参数列表不同,表示它们不是同一个函数。
int fun2(void* p)
{
return 22;
}
//return语句返回值的数据类型必须与函数的声明一致。
int fun3()
{
return "hello"; //报错了,函数的数据类型是 int,返回值却是 string
}
//在函数体中,return语句可以多次使用。
int fun4()
{
return 4;
return 4;
return 4;
return 4;
}
//如果函数的重点是实现功能,不关心返回值,返回值的数据类型填void,return语句后面就空着。
void fun5()
{
return;
}
//在函数的声明和函数的定义中,参数命名可以不同,但是没必要这么书写。
int fun6(int a);
int main(int argc, char ** argv)
{
//函数的声明必须和函数的定义一致(返回值的数据类型、函数名和参数列表),如果函数名和参数列表不同,表示它们不是同一个函数。
cout<< fun2() <<endl; //输出 2
cout<< fun2((void*)1) <<endl; //输出 22
return 0;
}
//函数的声明和定义分开书写,定义可以需要放在main函数的下面或上面均可
int fun1()
{
return 1;
} //如果函数的声明和定义分开书写,函数的定义后面一定不能写分号
//在同一个程序中,函数只需要声明和定义一次,也可以多次声明,但只能定义一次。
int fun1() //多次定义,报错了
{
return 1;
}
//在函数的声明和函数的定义中,参数命名可以不同,但是没必要这么书写。
int fun6(int b)
{
return 6;
}
2、函数的调用
语法:函数名(参数一,参数二,……)
注意:
(1)声明函数的代码必须放在调用之前,定义函数的代码可以放在调用之后。
#include <iostream>
using namespace std;
int myAdd(int a, int b); //声明在调用之前
int main(int argc, char ** argv)
{
//函数调用
cout<< myAdd(10, 20) <<endl; //输出 30
return 0;
}
//定义在调用之后
int myAdd(int a, int b)
{
return a + b;
}
(2)调用函数的时候,参数列表必须与函数的声明一致(参数的个数、书写的顺序和数据类型)。
(3)在普通函数中,可以调用其它的普通函数。
#include <iostream>
using namespace std;
int myAdd(int a, int b); //声明在调用之前
int addFun(int a, int b);
int main()
{
//函数调用
cout<< myAdd(10, 20) <<endl; //输出 30
cout<< addFun(20, 30) <<endl;
return 0;
}
int addFun(int a, int b)
{
//可以在函数中调用其他函数
return myAdd(a, b);
}
//定义在调用之后
int myAdd(int a, int b)
{
return a + b;
}
(4)调用函数的代码可以独占一条语句,也可以用于表达式(赋值运算、算术运算、关系运算、函数的参数)。
(5)如果函数用于表达式中,返回值的数据类型要匹配(否则可能会被隐式转换或编译错误)。
(6)如果函数有返回值,可以不关心它,忽略它。