函数的分文件编写
1.1头文件-函数声明
//swap.h文件
#include<iostream>
using namespace std;
void swap(int a, int b);
1.2源文件-函数定义
在源文件中,要加上头文件引用#include "swap.h"
//swap.cpp文件
#include "swap.h"
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
1.3主函数-函数调用
//main函数文件
#include "swap.h"
int main() {
int a = 100;
int b = 200;
swap(a, b);
system("pause");
return 0;
}
函数参数
2.1参数为一维数组
当函数参数是一维数组时,需要在函数声明中指定数组的长度或者使用指针类型的参数来接收数组。
#include <iostream>
using namespace std;
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = { 1, 2, 3, 4, 5 };
int size = sizeof(arr) / sizeof(int);
printArray(arr, size);
return 0;
}
2.2参数为二维数组
二维数组实际上是由多个一维数组组成的数组。当将二维数组作为函数参数时,可以使用指向数组首元素的指针或者使用数组的引用来接收它。
#include <iostream>
using namespace std;
void print2DArray(int** arr, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << arr[i][j] << " ";
}
cout << std::endl;
}
}
int main() {
int arr[3][4] = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12} };
int** ptr = new int* [3];
for (int i = 0; i < 3; i++) {
ptr[i] = arr[i];
}
print2DArray(ptr, 3, 4);
delete[] ptr;
return 0;
}
可以看出,C++的函数传入传出数组非常麻烦,建议使用C++标准库中的vector容器来代替二维数组,使代码更加简洁和易于管理。
#include <iostream>
#include <vector>
using namespace std;
void print2DVector(vector<vector<int>> arr) {
for (int i = 0; i < arr.size(); i++) {
for (int j = 0; j < arr[i].size(); j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int main() {
vector<vector<int>> arr = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
print2DVector(arr);
return 0;
}
vector可以很好的替代二维以及二维以上的数组,同时包含大量函数(例arr.size())可以使用,之后会详细介绍。
默认参数
如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
int func(int a, int b = 10, int c = 10) {
return a + b + c;
}
如果函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
return a + b;
}
函数重载
函数重载要在同一个作用域下
#include <iostream>
using namespace std;
int func()
{
cout << "func 的调用!" << endl;
return 0;
}
int func(int a)
{
cout << "func (int a) 的调用!" << endl;
return 0;
}
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() {
int a=func();
int b=func(10);
func(3.14);
func(10, 3.14);
func(3.14, 10);
system("pause");
return 0;
}
函数的返回类型不能作为一个重载的条件
函数重载要尽量避免默认参数,以免引起混淆