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;
}
http://www.pythonschool.com/python/81.html