C++ 函数

本文详细介绍了C++中的函数定义、参数传递方式,包括值传递、引用传递以及数组作为参数的传递机制。还探讨了可变参数函数的实现,以及如何使用函数模板实现泛型编程。通过实例展示了函数指针、默认参数、函数重载等特性,并强调了引用在函数参数中的重要作用,以及常量引用的使用场景。
摘要由CSDN通过智能技术生成

定义函数

#include <iostream>

void test1(int number);

int main() {
    int a = 100;

    test1(a);

    return 0;
}

void test1(int number) {
    std::cout << "this is test1(). " << number << std::endl;
}

数组作为参数

是将数组的第一个元素的地址传递过去,并不是将数组内容传递给函数。

#include <iostream>

void test1(int num[], int n);

int main() {
    int a[3] = {1, 21, 56};

    test1(a, 3);

    return 0;
}

void test1(int num[], int n) {
    for (int i = 0; i < 3; ++i) {
        std::cout << num[i] << std::endl;
    }
}

可变参数

#include <iostream>
#include <stdarg.h> // 可变参数支持

void sum(int count, ...){
    va_list vp;  // 可变参数的动作
    va_start(vp, count);

    int number1 = va_arg(vp, int);
    std::cout <<  number1 << std::endl;

    int number2 = va_arg(vp, int);
    std::cout <<  number2 << std::endl;

    va_end(vp);
}

int main() {
    sum(999, 10, 21, 32, 41, 5, 62);

    return 0;
}
// 打印结果:
//10
//21

1)for 遍历

#include <iostream>
#include <stdarg.h> // 可变参数支持

void sum(int count, ...){
    va_list vp;  // 可变参数的动作
    va_start(vp, count);

    for (int i = 0; i < count; ++i) {
        std::cout <<  va_arg(vp, int) << std::endl;
    }

    va_end(vp);
}

int main() {
    sum(6, 10, 21, 32, 41, 5, 62);

    return 0;
}

函数特殊写法

#include <iostream>

// int 和 double 可用于以后扩展
void MyTest(char * text, int, double ){
    std::cout << text << std::endl;
}

int main() {
    MyTest("hello", 1, 2.0);
    
    return 0;
}

默认参数

#include <iostream>

void test1(int number1, int number2 = 10) {
    std::cout << number1 * number2 << std::endl;
}
int main() {
    int a = 100;
    test1(a); // 1000

    int b = 200;
    test1(a, b); // 20000

    return 0;
}

预定义函数 / 内置函数

#include <iostream>
#include <algorithm>

int main() {
    std::plus<int> add_fun;
    int res1 = add_fun(1, 2);
    std::cout << res1 << std::endl;

    std::minus<float> minus_fun;
    float res2 = minus_fun(2.1F, 11.23);
    std::cout << res2 << std::endl;

    std::multiplies<int> multiplies_fun;
    int res3 = multiplies_fun(23, 3);
    std::cout << res3 << std::endl;

    return 0;
}

函数指针

函数也有地址,函数的地址是存储其机器语言代码的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它;与直接调用另一个函数相比,这种方法笨拙,但它允许再不同的时间传递不同的函数地址。

#include <iostream>

int test1(int n) {
    return n * 10;
}

int test2(int n) {
    return n * 100;
}

void test3(int number, int (*pf)(int)) {
    std::cout << (*pf)(number) << std::endl;
}

int main() {
    test3(10, test1);
    test3(20, test2);
    
    return 0;
}
// result:
// 100
// 2000

引用变量

创建引用变量

& 既可以用来表示变量的地址,也可以用来声明引用。

将number2 作为number1 变量的别名:
它们指向的是相同的值和内存单元。

#include <iostream>

int main() {
    int number1 = 10;
    int & number2 = number1;

    std::cout << number1 << ", " << &number1 << std::endl; // 10, 0xffffcc34
    std::cout << number2 << ", " << &number2 << std::endl; // 10, 0xffffcc34

    return 0;
}

引用用于函数参数

case1

这种交换变量的方式,并不能改变number1 和 number2的值。
变量a和b相当于复制了number1和 number2的值的新变量,因此交换a和b,并不影响number1和 number2的值。

#include <iostream>

void swap1(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main() {
    int number1 = 10;
    int number2 = 50;

    swap1(number1, number2);
    std::cout << number1 << ", " << number2 << std::endl; // 10, 50
    
    return 0;
}
case2 指针方式

指针方式,能修改number1 和 number2的值。

#include <iostream>

void swap2(int * a, int * b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int number1 = 10;
    int number2 = 50;

    swap2(&number1, &number2);
    std::cout << number1 << ", " << number2 << std::endl; // 50, 10

    return 0;
}
case3 引用方式

a和b相当于number1和number2的别名,交换a和b的值,相当于交换number1和number2的值。

#include <iostream>

void swap3(int &a, int &b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main() {
    int number1 = 10;
    int number2 = 50;

    swap3(number1, number2);
    std::cout << number1 << ", " << number2 << std::endl; // 50, 10

    return 0;
}

引用用于结构

#include <iostream>

struct show1 {
    std::string name;
    int age;
};

void test1(show1 & s) {
    std::cout << s.name << ", " << s.age << std::endl; // zhangSan, 23
}

int main() {
    show1 one = {"zhangSan", 23};

    test1(one);

    return 0;
}

常量引用

常量引用,无法修改,只读

#include <iostream>

// 常量引用,无法修改,只读
void get(const int & a) {
//    a = a + 10;  // 不允许修改
    std::cout << a << std::endl;
}

int main() {
    int number = 10;
    get(number);
    
    return 0;
}

函数重载

C不支持,C++支持

#include <iostream>

// 默认值
void change(bool isOK = 0) {
    std::cout << isOK << std::endl;
}

void change(int a){
    std::cout << a << std::endl;
}

void change(int a, int b){
    std::cout << a << ", " << b << std::endl;
}

int main() {
    change();

    change(1);

    change(1,2);

    return 0;
}

函数模板(似java泛型)

#include <iostream>

template <typename  T>

void addAction(T number1, T number2) {
    std::cout << number1 + number2 << std::endl;
}

int main() {
    addAction(1, 2);
    addAction(1.1f, 2.1f);
    addAction(1.2, 1.3);
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值