程序是由函数组成的,一个函数就是程序中的一个模块。函数既可以相互调用,也可以将互相联系密切的语句都放到一个函数内,还可以将复杂的函数分解成多个子函数。此外,函数本身也有很多特点,熟练掌握函数的特点可以将程序的结构设计得更加合理。
一、函数的表现形式
类型标识符 函数名(形式参数列表)
{
变量的声明
语句
}
二、函数的定义
(1)主函数
主函数是程序的入口,代码举例如下:
#include <iostream>
using namespace std;
void main()
{
cout << "我是一个主函数" << endl;
}
(2)普通函数
void showAge() {
cout << "我今年5岁了" << endl;
}
除了主函数之外,普通函数必须要声明:
void showAge();
(3)函数可以放入另一个函数内
#include <iostream>
using namespace std;
void showAge();
void main()
{
showAge();
}
void showAge() {
cout << "我今年5岁了" << endl;
}
三、函数参数
(1)空函数
空函数没有参数和返回值,函数的作用域为空的函数就是空函数。
void function(){}
(2)形参和实参
带有参数的方法如下:
void function(int a, int b) {}
其中,a和b就是方法的形式参数(简称形参)。
void main()
{
function(3, 4);
}
function方法里面的参数3和4叫做实际参数(简称实参)。
(3)给形参设置默认值
方法的形式参数可以设置默认值,如果参数设置默认值,该方法就无法声明,需要将该方法放在main方法的前面。
void function(int a = 4) {
cout << "a=" << a << endl;
}
int main()
{
function();
function(5);
return 0;
}
可以有多个参数,当有多个参数时,没有默认值的参数要放在左边,有默认值的参数要放在右边,否则编译报错。
void function(int a, int b = 4) {
cout << "a+b=" << a + b << endl;
}
int main()
{
function(3, 5);
function(3);
return 0;
}
有默认值的形参可以没有实参,没有默认值的形参,必须要有实参。
(3)可变参数
在实际开发中,会经常遇到这样的代码:
void function(int a) {
}
void function(int a, int b) {
}
void function(int a, int b, int c) {
}
void function(int a, int b, int c, int d) {
}
以上四个方法虽然参数个数不一致,本质上它们的行为基本差不多,如果需要声明的话也会存在冗余代码:
void function(int a);
void function(int a, int b);
void function(int a, int b, int c);
void function(int a, int b, int c, int d);
采用可变参数
优化代码:
#include <iostream>
using namespace std;
void function(int a, ...) {
}
int main()
{
function(3);
return 0;
}
四、函数的返回值
函数名之前是函数的返回值类型,下面举几个例子:
(1)无返回值类型
void function() {
cout << "执行了函数function" << endl;
}
void表示函数没有返回值类型。返回值通过关键字return
来返回。所以,以上代码可以写成:
void function() {
cout << "执行了函数function" << endl;
return;
}
(2)有返回值类型
int function() {
cout << "执行了函数function" << endl;
return 0;
}
function的返回值类型是int,所以return
后面需要跟一个整型,最终将整型返回。
有返回值的函数的用法如下:
int function() {
cout << "执行了函数function" << endl;
return 0;
}
int main()
{
int inte = function();
cout << "返回的整数值:" << inte << endl;
return 0;
}
五、重载函数
int function() {
return 0;
}
float function(int a) {
return 0;
}
double function(int a, int c) {
return 0;
}
先看下以上代码的细节:
(1)函数名一致;
(2)函数的返回值类型不同;
(3)函数形式参数的类型、数量都不同;
我们将这种函数名一致,函数返回值的类型、形式参数的类型、形式参数的个数不同的函数称为重载函数。
六、内联函数
内联函数的代码实例如下:
#include <iostream>
using namespace std;
inline int function();
int main()
{
int inte = function();
cout << "返回的整数值:" << inte << endl;
return 0;
}
int function() {
return 0;
}
使用 inline 关键字修饰的函数,编译器会在每个调用该函数的地方展开一个函数的副本。使用内联函数可以减少函数调用带来的开销(在程序所在的文件内移动指针寻找调用函数地址带来的开销)。
七、变量的存储类别
存储类别是变量的属性之一,C++语言中定义了4钟变量的存储类别,分别是auto变量、static变量、register变量、extern变量。变量的存储方式不同会使变量的生存期不同。
(1)auto变量
auto
存储类型是C++语言程序中默认的存储类型。
如果函数内未加存储类型,默认为自动变量类型(auto
),反过来说,自动变量可以省略关键字auto
。
int a = 0;
(2)static变量
static
变量是静态变量,静态变量的值会常驻内存,它的生命周期比较长。
静态变量属于静态存储方式,它具有以下几个特点:
(1)静态变量在函数内定义,在程序退出时释放,在程序整个运行期间都不释放,也就是说它的生存期为整个源程序。
(2)静态变量的作用域与自动变量相同,在函数内定义就在函数内使用,尽管该变量还继续存在,
但不能使用它,如再次调用定义它的函数时,它又可继续使用。
(3)编译器会为静态局部变量自动赋值为0;(auto变量必须初始化,static变量可以不初始化)
#include <iostream>
using namespace std;
inline int function();
int main()
{
int inte;
for (int i = 0; i < 3; i++) {
inte = function();
}
cout << "返回的整数值:" << inte << endl;
return 0;
}
int function() {
int a = 0;
return ++a;
}
看下上面一段代码,输出的结果为1。因为每次执行完function函数,局部变量a的缓存都会被释放,所以执行function时,a总是会被初始化成0;
但是如果将:
int a = 0;
改成
static int a = 0;
a会一直在缓存中,循环3次,a的值会递增,所以结果为3;
(3)register变量
register
变量又称寄存器变量,被register修饰的变量将不再保存到缓存中,该变量会保存在寄存器中。
使用时不需要访问内存,直接访问寄存器即可,从而节省了内存。
register起到优化程序的作用。
register int a = 0;
(4)extern变量
ConsoleApplication2.cpp文件代码:
#include <iostream>
using namespace std;
extern int a, b, c;
void function() {
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "b:" << c << endl;
}
ConsoleApplication1.cpp文件代码:
#include <iostream>
#include"ConsoleApplication2.cpp"
using namespace std;
int a = 2, b = 3, c = 4;
int main()
{
function();
return 0;
}
a、b、c是在ConsoleApplication1.cpp中定义的,在ConsoleApplication2.cpp中通过extern
关键字访问ConsoleApplication1.cpp中的变量。
[本章完...]