在函数内部声明函数是不是一个合法但毫无意义的行为呢?该如何处理
在函数内部声明函数是不是一个合法但毫无意义的行为呢?
比如int main()
{
void swap(int &,int &); // 这个声明是合法的,
int a=3,b=5;
swap(a,b);
cout < < "a= " < <a < < "b= " < <b < <endl;
return 0;
}
虽然声明合法,但是它的使用域仅在main函数内,并不能正确指示main之外的swap(),所以不会调用期望的swap.
而函数内部定义函数必定非法。参看《C++ program language》
那照这样说,在函数内部声明函数是不是一个合法但毫无意义的行为呢?
------解决方案--------------------
定义和声明是不一样的。
------解决方案--------------------
void f()
{
return;
void f2();只声明不定义(它的使用域仅在f()内)
f2();
}
void f2();只声明不定义(它的使用域f2()以后到文件尾).
void f1()
{
f2();
return;
}
void f2()
{
return;
}
------解决方案--------------------
合法且有意义
比如
int main()
{
int n = add(1, 2);
return 0;
}
int add(int x, int y)
{
return x + y;
}
上边这个是编译不过的
但改成这样就可以了
int main()
{
int add(int, int);
int n = add(1, 2);
return 0;
}
int add(int x, int y)
{
return x + y;
}
------解决方案--------------------
在函数内部声明函数是一个合法并有重要意义的行为!例如,有如下程序:
class X
{
public:
void show(int& a,int& b);
};
//把这个函数放于main()之外,和X具有相同的作用域:
void sxwap(int &,int &);
void main(void)
{
int a=3,b=5;
sxwap(a,b);
cout < < "a= " < <a < < " b= " < <b < <endl;
X x;
x.show(a,b); //演示用外部类的成员函数访问sxwap(a,b)函数!
cout < < "a= " < <a < < " b= " < <b < <endl;
_PAUSE;
}
void X::show(int &a,int &b)
{
sxwap(a,b);//可以访问到main()中声明的sxwap(a,b)函数!
}
void sxwap(int& a,int& b)//该定义对于X的成员函数show()不可见!
{
int _t = a;
a = b;
b= _t;
}
注意,重要的是sxwap(int& a,int& b)的定义对于X的成员函数show()不可见!但演示如上程序,一如预期,执行良好。
但如你所述,把 'void sxwap(int &,int &); '语句放于main()中,并且继续确保函数
sxwap(int& a,int& b)的定义对于X的成员函数show()不可见!例如:
class X
{
public:
void show(int& a,int& b);
};
void main(void)
{
//把这个函数放于main()之内:
void sxwap(int &,int &);
int a=3,b=5;
sxwap(a,b);
cout < < "a= " < <a < < " b= " < <b < <endl;
X x;
x.show(a,b); //演示用外部类的成员函数访问sxwap(a,b)函数!
cout < < "a= " < <a < < " b= " < <b < <endl;
_PAUSE;
}
void X::show(int &a,int &b))//该定义对于X的成员函数show()不可见!
{
sxwap(a,b);//生成错误!
}
void sxwap(int& a,int& b)
{
int _t = a;
a = b;
b= _t;
}
演示上述程序,在X类成员函数show()中调用sxwap(a,b)函数将生成编译期错误!这说明通过把sxwap(a,b)函数声明放在main()函数作用域之内,并控制其定义的可见度,可以良好的控制外部函数和外部类对main()函数(当然可以是任意函数)内声明函数的访问!这就是在函数内部声明函数的一个合法并有重要意义的行为!
比如int main()
{
void swap(int &,int &); // 这个声明是合法的,
int a=3,b=5;
swap(a,b);
cout < < "a= " < <a < < "b= " < <b < <endl;
return 0;
}
虽然声明合法,但是它的使用域仅在main函数内,并不能正确指示main之外的swap(),所以不会调用期望的swap.
而函数内部定义函数必定非法。参看《C++ program language》
那照这样说,在函数内部声明函数是不是一个合法但毫无意义的行为呢?
------解决方案--------------------
定义和声明是不一样的。
------解决方案--------------------
void f()
{
return;
void f2();只声明不定义(它的使用域仅在f()内)
f2();
}
void f2();只声明不定义(它的使用域f2()以后到文件尾).
void f1()
{
f2();
return;
}
void f2()
{
return;
}
------解决方案--------------------
合法且有意义
比如
int main()
{
int n = add(1, 2);
return 0;
}
int add(int x, int y)
{
return x + y;
}
上边这个是编译不过的
但改成这样就可以了
int main()
{
int add(int, int);
int n = add(1, 2);
return 0;
}
int add(int x, int y)
{
return x + y;
}
------解决方案--------------------
在函数内部声明函数是一个合法并有重要意义的行为!例如,有如下程序:
class X
{
public:
void show(int& a,int& b);
};
//把这个函数放于main()之外,和X具有相同的作用域:
void sxwap(int &,int &);
void main(void)
{
int a=3,b=5;
sxwap(a,b);
cout < < "a= " < <a < < " b= " < <b < <endl;
X x;
x.show(a,b); //演示用外部类的成员函数访问sxwap(a,b)函数!
cout < < "a= " < <a < < " b= " < <b < <endl;
_PAUSE;
}
void X::show(int &a,int &b)
{
sxwap(a,b);//可以访问到main()中声明的sxwap(a,b)函数!
}
void sxwap(int& a,int& b)//该定义对于X的成员函数show()不可见!
{
int _t = a;
a = b;
b= _t;
}
注意,重要的是sxwap(int& a,int& b)的定义对于X的成员函数show()不可见!但演示如上程序,一如预期,执行良好。
但如你所述,把 'void sxwap(int &,int &); '语句放于main()中,并且继续确保函数
sxwap(int& a,int& b)的定义对于X的成员函数show()不可见!例如:
class X
{
public:
void show(int& a,int& b);
};
void main(void)
{
//把这个函数放于main()之内:
void sxwap(int &,int &);
int a=3,b=5;
sxwap(a,b);
cout < < "a= " < <a < < " b= " < <b < <endl;
X x;
x.show(a,b); //演示用外部类的成员函数访问sxwap(a,b)函数!
cout < < "a= " < <a < < " b= " < <b < <endl;
_PAUSE;
}
void X::show(int &a,int &b))//该定义对于X的成员函数show()不可见!
{
sxwap(a,b);//生成错误!
}
void sxwap(int& a,int& b)
{
int _t = a;
a = b;
b= _t;
}
演示上述程序,在X类成员函数show()中调用sxwap(a,b)函数将生成编译期错误!这说明通过把sxwap(a,b)函数声明放在main()函数作用域之内,并控制其定义的可见度,可以良好的控制外部函数和外部类对main()函数(当然可以是任意函数)内声明函数的访问!这就是在函数内部声明函数的一个合法并有重要意义的行为!