函数学习笔记

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;
}



原文地址:https://www.cnblogs.com/pythonschool/p/2750880.html