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