C++回炉之_C++PrimerPlus_第七章 函数 -- C++的编程模块(一)

函数定义及声明

type_name function_name (parament_list) {   // 返回值类型 函数名 参数列表
    statements;
    return value;                           // value的类型为 type_name
}
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;

int sum(int a, int b);              // 函数声明

int main() {

    cout << sum(1, 2) << endl;      // 函数调用
    return 0;

}

int sum(int a, int b) {             // 函数定义
    return a + b;
}
  • 函数可在声明处直接定义, 但不可以在main函数之后声明 – 识别不出
  • 返回值类型
    • 函数返回值类型可为 整型, 浮点型,指针,字符,结构体,对象等
    • 函数返回值类型可为 void, 此时不需要return,但可在必要的地方使用 return; 跳出函数体
    • 函数返回值不可为数组, 但可以将数组作为结构体或对象的组成部分来返回
  • 函数原型声明时的参数列表里可不包括变量名, 也不必与定义时的变量名一致

函数参数

  • 函数的参数相当于在函数中声明的局部变量
  • 将参量赋值给参数的过程相当于给函数的局部变量赋值的过程
  • 一个函数可以有多个参数,使用逗号隔开

函数和数组

int sum_arr(int arr[], int n) {
    int res = 0;
    for(int i = 0; i < n; ++i) res += arr[i];
    return res
}
  • 方括号为空表示可以将任意长度的数组传递给此函数
  • arr实际上不是一个数组,而是一个指针 – 所以才可以传任意长度
  • 调用时将数组名传入此函数列表 – 作为指针
  • 在函数中可以像使用数组一样使用指针参数
  • 真正正确的写法应该是 int sum(int* arr, int n);
    • 但是在函数原型中,int* arr 和 int arr[] 含义相同
  • 将数组传入函数时,函数里修改的并非数组的副本,而是数组本身 – 传进来的是真实的地址
  • 对arr使用sizeof并非是整个数组的长度, 而是int*指针的长度(可能是4字节)
  • 有时候不想修改原数组的数据,可对函数的数组参数使用const关键字

    void show_arr(const int arr[], int n) {
        for(int i = 0; i < n; ++i) cout << arr[i] << endl;
    }

数组区间 – 迭代器雏形

int sum_arr(const int* begin, const int* end) {
    int tot = 0;
    for(const int *p = begin; p != end; ++p) tot += (*p);
    return tot;
}
int a[5] = {1, 2, 3, 4, 5};
cout << sum_arr(a+1, a+3) << endl;

指针和const

  • 让指针指向一个常量对象

    • p 指向一个const int
    • 即不能使用p来修改其指向的值(但可能会以其他方式修改)
    • 即 (*p) 的值为const, 不可修改
    • 但 p 的值是可以修改的(如 p++ )
    • 不可将const 的地址赋给非const指针(这样会使const无意义)
    • 只有在一级间接关系的情况下将非const指针赋给const 指针是安全的
    int a = 5;
    const int* p = &a;
  • 将指针本身声明为常量

    • p 为const类型, 指向一个int
    • 即 p 只能指向a, 不能再指向其他的地址
    • 即 p 的值为const, 不可修改
    • 但可使用 p 来修改a的值
    • 即 (*p) 的值为非const的, 可以修改
    int a = 5;
    int* const p = &a;
  • 如果愿意,也可声明指向const对象的const指针

    • 此时 p 和 (*p) 都是const, 都不能用来修改b的值
    double b = 0.5;
    const double* const p = &b;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值