2

函数是否可以访问直接外部作用域中的变量,而无需在 C++ 中向函数输入参数?

=========

这是我正在处理的代码

#include...
void ReadGrid();
void SaveGrid();

int main(){
  ReadGrid();
}

void ReadGrid() {
  int m=1; 
  int n[]={1,2,3}; 
  vector<int> o(3,10);
  SaveGrid();
}

void SaveGrid() {
  int a=m;
  int b=n[1];
  int c=o[1];
}

为什么我不能访问ReadGrid()函数中的变量,调用时SaveGrid()局部作用域不SaveGrid()将作用域ReadGrid()视为全局SaveGrid()

4

4 回答 4

2

您的问题可能会更好地形成:

当函数a()调用函数b()时,是否会b()自动获得所有a()局部变量的可见性?

答案是……不。无论您的调用堆栈如何,它们仍然是不同的块作用域。

于 2013-07-03T12:45:49.510 回答
1

每组大括号表示一个单独的范围,因此如果您创建一个带有大括号的块,并在其中声明变量,则它们在其外部将不可见。如果您创建嵌套的大括号块,则它们具有内部块可以访问外部块,但反之则不行。

这不仅适用于函数(总是有其范围),也适用于函数内部的块。

即两个不同的变量named i,因为作用域不同,没有nameclash:

{
   int i;
}

{
   int i;
}

在这里我们可以访问。

{
   int i;
   {
      int x = i;   <== in scope
   }

   int y = x; <== error
}

如果您想将一组 ov 变量与某个逻辑函数相关联,那么您应该将它们放在一个类或结构中。

于 2013-07-03T12:43:07.077 回答
0

不,但这是对象可以发挥作用的地方,例如在这个伪代码中它们共享相同的数据:

class Grid {
private:
    int m;
    int n[];
    vector<int> o;

public:
    void ReadGrid(){
        // get m,n, and o
    }

    void SaveGrid() {
        // put m,n, and o
    }
}

int main(){
    Grid grid;
    grid.ReadGrid();
}
于 2013-07-03T12:45:42.353 回答
0

没有什么是不合逻辑的。

如果您希望 m 的值对 ReadGrid 和 SaveGrid 都可用,那么您必须将“m”定义为全局变量,您可以在 ReadGrid 中对其进行初始化并在 SaveGrid 中使用相同的值。

这是一个片段,供您参考

#include...
void ReadGrid();
void SaveGrid();

int m;// global variable 
int n[];//global variable

int main(){
ReadGrid();
}

void ReadGrid() {
m=1; 
n[]={1,2,3}; 
SaveGrid();
}

void SaveGrid() {
int a=m;
int b=n[1];
}
于 2013-07-03T12:49:08.650 回答