一般情况
子函数的创建格式一般是如下形式:
1.带返回值
typeName functionName(typeName1 x1,typeName2 x2,...,typeName xn);
or
typeName functionName(void);
2.不带返回值
void functionName(typeName1 x1,typeName2 x2,...,typeName xn);
or
void functionName(void);
在声明函数时通常可以省略形参名称:例如:
typeName functionName(typeName1 ,typeName2 ,...,typeName );
int add(int,int);//调用时只看形参的类型和数目。
调用函数时,若需要向子函数传递形参,则一般需要在定义时带上形参的名称,以便值传递;
void swap(int a,int b);
{
int temp=0;
temp=a;
a=b;
b=temp;
}
采用全局变量作为函数参数有什么好处呢?
采用全局变量作为参数有时具有意想不到好处:
#include<iostream>
using namespace std;
int a=3,b=5;
int add(int a,int b)
{
return a+b;
}
int main()
{
int c;
c=add(a,b);
cout<<c<<endl;
system("pause");
return 0;
}
显然这时候定义的形参有点多余。因为a,b是全局变量,其作用范围是从其定义位置起,到程序结束,之间都是有效的。所以,在add()中,不用形参传递就可以使用a,b且有效;所以上边可以修改为:
#include<iostream>
using namespace std;
int a = 3, b = 5;
int add()
{
return a + b;
}
int main()
{
int c;
c = add();
cout << c << endl;
system("pause");
return 0;
}
说了这么多有什么用呢?
呵呵,还真有点用处,有时候在引用其他函数时,其形式是确定的,所以一次传进的参数的个数是有限的。但是,此时你想传递函数的参数个数大于所给形参个数,哪该怎么办?我们可以将其余的参数定义成全局变量,此时就可以将参数传递进去了.
实例
例如在同时调用函数:
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
其回调函数的格式是固定的,若此时回调函数需要传递两个int型参数,则是无法进行的。
回调函数格式:
void Foo(int,void\*);
自定义的回调函数:
static void on_ContrastAndBright(int, void*)
{
namedWindow("【原始窗口】", 1);
for (int y = 0; y < g_scrImage.rows; y++)
{
for (int x = 0; x < g_scrImage.cols; x++)
{
for (int c = 0; c < 3; c++)
{
g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
((g_nContrastValue*0.01)*(g_scrImage.at<Vec3b>)
(y, x)[c]) + g_nBrightValue;
}
}
}
imshow("【原始图窗口】", g_scrImage);
imshow("【效果图窗口】", g_dstImage);
}
其中:
/*
g_scrImage、g_dstImage、g_nContrastValue、g_nBrightValue均需要传递进来,但是由于函数定义类型的限制,不能通过形参传递,所以采用全局变量传递。
*/
总结
向子函数传值不经可以通过形参(局部变量),当然还可以通过全局变量;
当然还可以通过指针等方式进行传递等等。
水平有限,若有误请指出,谢谢!