zoukankan      html  css  js  c++  java
  • 函数学习笔记

    int (&array)[10] 中的括号是不可以活力的,如果省略了括号,"[]"运算符的优先级高于"&"运算符,便成了引用数组,而在C++语言中定义引用数组是非法的.
    int (&array)[10] 的格式是合法的,表示定义一个引用对象,它可以指向(严格地说应该是取代)具有10个元素的数组.这里回忆一下指针数组的定义.
    int *parray[5]; //定义一个指针数组
    对里如果对"*parray"使用括号括起来,其性质就变了.例如:
    int (*parray)[5]; //定义一个整形指针,可以指向5个元素的整形数组
    上述代码实际定义了一个整型指针,可以指向具有5个元素的数组.这与"int(&array)[10]"是类似的,
    "int (&array)[10]" 表示一个引用,指向具有10个元素的整型数组.因此,以"int (&array)[10]"形式定义函数参数列表,编译器会强制检查数据元素的个数,如果不为10,会显示编译错误.

    **指针或引用作为函数参数
    在C++语言中,函数参数的传递方式主要有两种,分别为值传递和引用传递.
    所谓值传递,是指在函数调用时,将实际参数的值复制一份传递到调用函数中.
    引用传递,是指在函数调用时,将实际参数的地址传递到调用函数中.

    void ValuePass(int *var)
    {
        *var = 10;
        printf("%d\n", *var);  
    }
    int main()
    {
        int ivar = 5;
        ValuePass(&ivar);
        printf("%d\n", ivar);
        return 0;
    }
    
    void ValuePass(int &var)
    {
        var = 10;
        printf("%d\n", var);  
    }
    int main()
    {
        int ivar = 5;
        ValuePass(ivar);
        printf("%d\n", ivar);
        return 0;
    }

    定义活力号形式的函数参数.

    #include "stdafx.h"
    #include "iostream.h"
    #include "stdarg.h"
    
    void OutputInfo(int num, ...)
    {
        va_list arguments;
        va_start(arguments, num);
        while(num--)
        {
            char * pchData = va_arg(arguments, char*);
            int iData = va_arg(arguments, int);
            printf("%s\n", pchData);
            printf("%d\n", iData);
    
        }
        va_end(arguments);
    
    }
    
    
    int main(int argc, char* argv[])
    {
    
        OutputInfo(2,"北京", 2008, "上海", 2012);
    
        return 0;
    }

    局部域中声明的函数将隐藏而不是重载全局域中的函数.

    #include "stdafx.h"
    #include "iostream.h"
    #include "stdarg.h"
    
    bool Validate(float x)
    {
        printf("浮点参数函数\n");
        return (x>0)?true:false;
    }
    bool Validate(int x)
    {
        printf("整数参数函数\n");
        return (x>0)?true:false;
    }
    
    int main(int argc, char* argv[])
    {
        bool Validate(double x, double y); //隐藏了全局域中的函数
        ::Validate(10.5f); //使用域运算符:: 才可调用第一个重载函数
        
    
        return 0;
    }
    
    bool Validate(double x, double y)
    {
        printf("实型参数函数\n");
        return (x>y)?true:false;
    }

    函数指针

    对于C++语言来说,函数名实际上是指向函数的长指针.例如,下面的代码定义了一个指向具有两个整型参数的函数指针.
    int (*ptfun)(int, int);
    也可以使用typedef定义一个函数指针类型,然后定义该类型的变量.例如:
    typedef int (*ptfun)(int, int);
    ptfun fun;
    使用函数指针调用函数:

    #include "stdafx.h"
    typedef int (*ptfun)(int, int); //定义一个函数指针类型
    int sum(int x, int y)
    {
        return x+y;
    }
    int main(int argc, char* argv[])
    {
        ptfun fun;  //定义一个函数指针变量
        fun = sum;  //将函数sum 赋值给函数指针变量
        int ret = fun(10, 20); //通过函数指针变量调用sum函数
        return 0;
    }

     重载函数模板

    #include "iostream.h"
    
    template <class type> //定义一个模板类型
    type Add(type Plus, type Summand) //定义一个重载的函数模板
    {
        return Plus + Summand; //返回两个数之和
    }
    template <class type> //定义一个模板类型
    type Add(type Array[], int nLen) //定义一个重载的函数模板
    {
        type tRet = 0; //定义一个变量
        for(int i=0;i<nLen;i++) //利用循环累计求和
        {
            tRet+=Array[i];
        }
        return tRet; //返回结果
    }
    
    int main(int argc, char* argv[]) //主函数
    {
        int nRet = Add(100, 200); //调用第1个重载的函数模板,实现两个数的求和运算
        cout << "整数之和:" << nRet << endl; //输出结果
        
        int nArray[5] = {1,2,3,4,5}; //定义一个整形数组
        int nSum = Add(nArray, 5); //调用第2个重载的函数模板,实现数组元素的求和运算
        cout << "数组元素之和:" << nSum << endl; //输出结果
        return 0;
    }



  • 相关阅读:
    连续子数组的最大和
    孩子们的游戏(圆圈中最后剩下的数)
    左旋转字符串
    业界难题-“跨库分页”的四种方案
    InnoDB意向锁的作用
    Linux下Fork与Exec使用
    minixml的安装教程
    main()函数的形参
    结构体数组初始化
    fork函数详解
  • 原文地址:https://www.cnblogs.com/pythonschool/p/2750880.html
Copyright © 2011-2022 走看看