Имеют ли функции доступ к переменным в ближайшей внешней области без ввода параметров в функцию в 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()
называется?
Ваш вопрос может быть лучше сформулирован так:
Когда функция
a()
функция вызоваb()
делаетb()
автоматически получить видимость во всехa()
локальные переменные?
И ответ нет. Они по-прежнему являются разными областями блоков, независимо от вашего стека вызовов.
Каждый набор фигурных скобок обозначает отдельную область видимости, поэтому, если вы создадите блок с фигурными скобками и объявите переменные внутри них, они не будут видны за его пределами. Если вы создаете вложенные блоки фигурных скобок, у них внутренний блок имеет доступ к внешнему блоку, но не наоборот.
Это также относится не только к функции (которая всегда имеет свою область действия), но также и к блокам внутри функции.
т.е. две разные переменные названы i
, именная строка отсутствует из-за разных областей применения:
{
int i;
}
{
int i;
}
Здесь у нас есть доступ.
{
int i;
{
int x = i; <== in scope
}
int y = x; <== error
}
Если вы хотите, чтобы переменные были связаны с какой-то логической функцией, вы должны поместить их в класс или структуру.
Нет, но здесь объекты могут вступать в игру, например, в этом псевдокоде они используют одни и те же данные:
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();
}
Нет, то, что пытаются сделать, нелогично.
Если вы хотите, чтобы значение 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];
}