C++ Primer Plus 第七章 函数-C++的编程模块

函数-C++的编程模块

函数参数和按值传递

用于接收传递值的变量称为形参,传递的值称为实参

C++标准中,用参数表示实参,用参量表示形参

在函数中的声明的变量是该函数私有的。在函数被调用时,计算机为这些变量分配内存,函数结束调用时,释放这些变量使用的内存。(函数中的变量也是在栈内存中)

函数和数组

在声明函数时 int *arr 和 int arr[] 同等效果,但是在其他情况下,int *arr 换 int arr[] 不同

详情p176

这样做可以减小计算机内存的开销,但是传入数组是原来的数组,这可能会导致原来的数据被破坏,对此,可以使用const限定符。
例如:

    int function(const int *arr,int arr_size);

指针和const

    int age = 39;
    const int * pt = &age;

该声明表示pt指向了一个const int ,因此不能通过pt来修改age,但是可以修改pt,不能将const int的变量赋值给非const int类型的指针(如果非要这样做,可以使用强制类型转换)。

    const int **pp2;
    int *p1;
    const int n = 13;
    pp2 = &p1;
    *pp2 = &n;
    *p1 = 10;

pp2指向一个指向const int的指针,因此将&p1赋值给pp2是可以的(因为p1可以指向const int,个人理解)。但是不能这么做。。。编译器会报错

不能将const int类型的数组或者变量传递到非const的函数中

    int age = 39;
    const int *pt = &age;
    int *const finger = &age;

两者不一样,前者表示指向const int的指针,后者表示 const的指针指向int.

函数和二维数组

    int data[3][4] = {...};
    ...
    int sum(int (*ar2)[4],int size); //用于接受 data
    int sum(int ar2[][4],int size); //同样用于接受 data
    ...
    int sum(int *ar2[4],int size); //不能接受 data

int *ar2[4]表示四个指向int的指针,int (*ar2)[4]表示指向 int[4]的指针

函数和C-风格字符串

函数和结构

结构可以如同普通变量一样赋值,结构的名字只是结构的名称,如果要获得结构的地址,同样需要使用&符号。

结构可以像变量一样在函数中传递值,但是如果结构非常大,赋值结构将增加内存要求(最初C语言不允许按值传递结构),很多程序员(C)倾向于使用地址传值

在C++中,有第三种选择——引用

函数和string对象

可以将一个结构赋值给另一个结构,也可以将一个对象赋值给另一个对象。可以将结构作为完整的实体传给函数,也可以将对象作为完整的实体进行传递。

递归

C++函数可以自己调用自己(与c语言不同的是,C++不允许main()函数调用自己),这种功能称为递归。

    void recurs(argumentlist){
        statements1
        if(test)
            recurs(arguments)
        statements2
    }

函数指针

1. 获取函数的地址

只需要使用函数名(后面不跟参数)即可。如果think()是一个函数,
那么think就是该函数的地址(和python有点类似)

2. 声明函数指针

声明指向函数的指针时,必须指定指针指向的函数原型。

    double pam(int); //函数原型
    double (*pf)(int); //pf即函数指针,*pf是指针指向的函数
    pf = pam;//赋值
    int age = 23;
    cout << pf(age) << (*pf)(age); //两种方式均可

使用(*pf)(age)可以直观的提示代码正在使用函数指针

auto是一个好东西

如果三个函数f1,f2,f3声明相同可以:

    const double * (*pa[3])(const double *, int) = {f1,f2,f3}

因为[]的优先级高于*,所以*pa[3]表名pa是一个包含三个指针的数组。

auto 只能用于单值初始化,不能用于初始化列表。

    auto pd = &pa;
    const double *(*(*pd)[3])(const double *, int) = &pa;

这两种声明相同效果,显然第二种更繁琐。

typedef

    typedef const double *(*p_fun)(const double *, int);
    p_fun p1 = f1;
    p_fun pa[3] = {f1,f2,f3};
    p_fun (*pd)[3] = &pa;

使用typedef可以减少输入量,减少出错率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值