C++基础入门 – 函数
概述
函数是将经常被使用的代码封装起来,实现完成某个功能,以达到简化程序的目的。它可以根据用户传递的数据实现相应的功能。
函数定义
- 返回值类型
- 函数名
- 参数列表
- 函数体语句
- return语句
语法:返回值类型 函数名 (参数列表){函数体语句 return语句 }
示例: 加法计算函数
int add(int a,int b)
{
int sum=a+b;
return sum;
}
//简化
int add(int a,int b)
{
return a+b;
}
注意:函数定义中的参数叫做形参,函数调用时候,传递的参数叫做实参,调用过程中会将实参的值传递给形参。
返回值类型
如果一个函数不需要返回值,声明返回值类型时可以写void
让笔者没想到的是,C++中赋值运算竟然支持函数调用返回作为左值参与赋值操作;
GetMax(a,b)=100;
int c=GetMax(a,b)=100;
函数声明
C++/C语言编译系统是由上往下编译的,被调函数需要声明在主调函数之前。不然由上往下的编译系统将无法识别。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明。函数的声明可以与定义分离。注意:一个函数只能被定义一次,但可以声明多次。
这个是1970年的C语言的历史遗留问题,强制程序员在使用函数之前声明函数,允许编译器检查参数是否为预期类型,因为40年前,限制编译时间和内存都是我们需要考虑的因素,提前声明函数,这样编译器就可以一次执行(即只读取一次代码)。还有之前的机器内存比较小,这样的编写能让编译器能够在内存资源有限的机器上运行。
注意:函数的声明不等同于函数的定义,这两个是不同的概念。定义表示需要开辟一段空间,要参与到程序的实际运行当中。而声明则只是对编译系统的一个说明,告诉编译器这里有这么个东西。函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型。不包含函数体。
示例-写在主调函数前
void add(int v)
{
v+=1;
}
int main()
{
add(v);
return 0;
}
注意:写在主调函数前,不需要额外声明。
示例-写在主调函数后
错误示例:
int main()
{
add(v);
return 0;
}
void add(int v)
{
v+=1;
}
注意:被调函数add如果写在主调函数后,那必须要在主调函数前声明一段函数声明。
正确示例:
int add(int v);//函数声明
int main()
{
add(v);
return 0;
}
void add(int v)
{
v+=1;
}
函数名
函数名的命名规则跟变量一样:C++语言基础入门(1)- 数据类型 - 麦瑞克博客 (playcreator.cn)
值传递
当我们做值传递时候,函数的形参发生改变,并不会影响实参。
void add(int v)
{
v+=1;
cout<<v<<endl;//output -> 1
}
int main()
{
int v=0;
cout<<v<<endl;//output -> 0
add(v);
cout<<v<<endl;//output -> 0
return 0;
}
这是最普通的形参方式,当函数被调用时,实参的副本初始化形参,函数并没有访问调用所传递的实参,因此v+=1不会修改实参的值。对v的操作只是修改了实参的一个副本。
2022/10/19 23:30 夜安了,熄灯了,该洗洗睡了,明天继续。
2022/10/26 16:00 前几天事比较多,没怎么学C++
分文件编写
- 创建.h后缀的头文件
- 创建.cpp后缀的源文件
- 在头文件中写函数声明
- 在.cpp后缀的源文件写函数定义
- 引入头文件
假设我们需要编写一套相关功能,我们可以为它们创建一个头文件用来声明,创建一个源文件引入头文件,并定义那些函数,当源文件有需要引入别的文件时候,在头文件中引入源文件所需要的文件。在主调函数所在源文件中引入头文件,即可完成调用。
示例:
Program.cpp文件
#include "Module.h"
#include <iostream>
using namespace std;
#include "stdlib.h"
int main()
{
TestMethod();
system("pause");
return 0;
}
Module.h头文件
#include <iostream>
using namespace std;
#include "stdlib.h"
void TestMethod();
Module.cpp文件
#include "Module.h"
void TestMethod()
{
cout << "Success" << endl;
}
本文所有案例代码:
函数进阶篇见文章:C++语言进阶-函数进阶篇|函数重载|默认参数|占位参数 - 麦瑞克博客 (playcreator.cn)
Const修饰函数
const修饰的函数可以重载。在类中,被const修饰的成员函数,不能修改类中的数据成员,也无法调用非const的成员函数;
const类对象只能调用const成员函数,非const对象无论是否是const成员函数都能调用,但是如果有重载的非const函数,非const对象会优先调用重载后的非const函数。
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/programming-life/cpp/2101/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
[…] 编辑器告诉我们TestMethod()方法没有被找到。如果不分文件编写就不会报错,这个问题就挺奇怪的吧。像大项目的话,分文件编写肯定是必要的。我这里所说的分文件编写,你可以去试试,看看有没有报错,如果你不是很清楚的什么叫分文件编写的话,你可以看下这篇文章 函数-分文件编写,把里面的示例复制到你的编辑器里试一试。 […]