C++函数(第五弹)

0 阅读2分钟

书接上文

C++循环与分支逻辑运算(第四弹)

简单聊一下这节内容

有过编程经验的小伙伴可能对函数并不陌生,这章会揭开函数的基本知识,函数原型,指向函数的指针等等...

函数定义

函数定义也很简单,类型,名字,代码块即可,也是有返回值和没返回值的区分;有趣的是C++的函数能返回整数,浮点数,结构体,对象但是不能够返回数组...有趣吧? 但是数组可以当成包含在结构体或者对象中返回。 代码:

using namespace std;
#include <iostream>
void hello()
{
    cout << "Hello World!" << endl;
}
int age()
{
    return 18;
}
int main()
{
    hello();
    cout << age() << endl;
}

运行结果:

image.png

函数的原型

为什么需要原型呢?原型是描述了从函数到编译器的接口,原型指出了返回值,入参参数等,能够让编译器提前知道这些信息;那为什么编译器不自己去文件搜索呢? 这样做效率很慢,而且文件很多的情况下得遍历文件,如何避免使用原型,就跟上面的函数定义一样,使用前定义一下,这是不科学的,通常编程的整体结构是比较复杂的,并不是说我要用到某个函数我才去定义。

using namespace std;
#include <iostream>
// 函数的原型
void hello();
// 函数的原型
int age();

int main()
{
    hello();
    cout << age() << endl;
}
void hello()
{
    cout<<"Hello World!"<<endl;
}
int age()
{
    return 18;
}

运行截图:

image.png

函数参数传递

函数的参数可以分为值传递和指针传递, 指针传递的是内存地址,修改指针指向的值会影响原来的值,值传递的是值的副本,修改值不会影响原来的值,因此值传递一般由基本类型组成。

值传递

代码所示:

#include <iostream>
using namespace std;
void function2(int);
int main() {
    int myInt = 1;
    function2(myInt);
    cout << "原始值: "+ std::to_string(myInt) << endl;
}
// 演示值传递
void function2(int a) {
    a = a + 1;
    cout << "函数值: " + std::to_string(a) << endl;
}

运行结果:

image.png

地址传递

地址传递,通过传递地址到函数里面,后面修改会对原值造成影响,数组传递的时候比较特殊,传递的是第一个值的地址,因此传入时需要带入长度,不然后面无法获取。 代码所示:

#include <algorithm>
#include <iostream>
using namespace std;

void function2(int *);

int function3(int [], int);

int main() {
    int myInt = 1;
    function2(&myInt);
    cout << "原始值: " + std::to_string(myInt) << endl;

    int arrayInt[] = {1, 2, 3, 4, 5};
    int size = sizeof(arrayInt) / sizeof(int);
    auto sum = function3(arrayInt, size);
    cout << sum << endl;
}

// 演示引用传递
void function2(int *a) {
    *a += 1;
    cout << "函数值: " + std::to_string(*a) << endl;
}
// 数组传递比较特殊,数组传递是传递数组的第一个元素,因此需要将长度传入,否则获取不了长度
int function3(int b[], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += b[i];
    }
    return sum;
}

运行结果:

image.png