Zakres w C++

Scope C



Encja w C++ ma nazwę, którą można zadeklarować i/lub zdefiniować. Deklaracja jest definicją, ale definicja niekoniecznie jest deklaracją. Definicja alokuje pamięć dla nazwanej jednostki, ale deklaracja może alokować pamięć dla nazwanej jednostki lub nie. Region deklaratywny to największa część programu, w której obowiązuje nazwa encji (zmienna). Ten region nazywa się zakresem lub potencjalnym zakresem. W tym artykule wyjaśniono ustalanie zakresu w C++. Ponadto do zrozumienia tego artykułu potrzebna jest podstawowa wiedza w języku C++.

Treść artykułu

Region deklaratywny i zakres

Region deklaratywny to największa część tekstu programu, w której obowiązuje nazwa podmiotu. Jest to region, w którym niekwalifikowana nazwa może być używana (widziana) w odniesieniu do tego samego podmiotu. Rozważ następujący krótki program:







#włączać
za pomocą przestrzeń nazwgodziny;

próżniafn()
{
intgdzie= 3;
Jeśli (1==1)
{
koszt<<gdzie<<' ';
}
}

intGłówny()
{
fn();
powrót 0;
}

Funkcja fn() ma dwa bloki: blok wewnętrzny dla warunku if i blok zewnętrzny dla treści funkcji. Identyfikator var jest wprowadzony i widoczny w zewnętrznym bloku. Jest to również widoczne w bloku wewnętrznym, z oświadczeniem cout. Bloki zewnętrzne i wewnętrzne są zakresem nazwy var.



Jednak nazwa var może nadal być używana do deklarowania innej jednostki, takiej jak zmiennoprzecinkowa w bloku wewnętrznym. Poniższy kod ilustruje to:



#włączać
za pomocą przestrzeń nazwgodziny;

próżniafn()
{
intgdzie= 3;
Jeśli (1==1)
{
pływakgdzie= 7,5;
koszt<<gdzie<<' ';
}
}

intGłówny()
{
fn();
powrót 0;
}

Wyjście to 7,5. W takim przypadku nazwa var nie może już być używana w bloku wewnętrznym w odniesieniu do liczby całkowitej o wartości 3, która została wprowadzona (zadeklarowana) w bloku zewnętrznym. Takie bloki wewnętrzne są określane jako potencjalny zakres dla jednostek zadeklarowanych w bloku zewnętrznym.





Uwaga: Jednostka tego samego typu, na przykład w bloku zewnętrznym, nadal może być zadeklarowana w bloku wewnętrznym. Jednak w tym przypadku to, co jest ważne w bloku wewnętrznym, to nowa deklaracja i jej znaczenie, podczas gdy stara deklaracja i jej znaczenie poza blokiem wewnętrznym pozostają ważne w bloku zewnętrznym.

Deklaracja o tej samej nazwie w bloku wewnętrznym zwykle zastępuje deklarację o tej samej nazwie poza tym blokiem wewnętrznym. Bloki wewnętrzne mogą zagnieżdżać inne bloki wewnętrzne.



Zakres globalny

Gdy programista dopiero zaczyna wpisywać plik, jest to zasięg globalny. Poniższy krótki program ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

pływakgdzie= 9,4;

intGłówny()
{
koszt <<gdzie<<' ';
koszt <<::gdzie<<' ';

powrót 0;
}

Dane wyjściowe to:
9,4
9,4

W takim przypadku deklaratywny region lub zakres dla var zaczyna się od punktu deklaracji dla var i kontynuuje w dół aż do końca pliku (jednostki tłumaczenia).

Blok funkcji main() ma inny zakres; jest to zakres zagnieżdżony dla zakresu globalnego. Aby uzyskać dostęp do jednostki o zasięgu globalnym, z innego zakresu, identyfikator jest używany bezpośrednio lub poprzedzony operatorem rozpoznawania zakresu :: .

Uwaga: Jednostka main() jest również zadeklarowana w zasięgu globalnym.

Zakres bloku

Instrukcja if, while, do, for lub switch może definiować blok. Takie stwierdzenie jest wyrażeniem złożonym. Nazwa zmiennej zadeklarowanej w bloku ma zasięg bloku. Jego zakres zaczyna się w miejscu deklaracji i kończy na końcu swojego bloku. Poniższy krótki program ilustruje to dla zmiennej ident:

#włączać
za pomocą przestrzeń nazwgodziny;

intGłówny()
{
Jeśli (1==1)
{
/*niektóre stwierdzenia*/
intident= 5;
koszt<<ident<<' ';
/*niektóre stwierdzenia*/
}
powrót 0;
}

Zmienna, taka jak ident, zadeklarowana w zakresie bloku jest zmienną lokalną.

Zmienną zadeklarowaną poza zakresem bloku i powyżej niego można zobaczyć w nagłówku bloku (np. warunek dla bloku if), a także wewnątrz bloku. Poniższy krótki program ilustruje to dla zmiennej, identif:

#włączać
za pomocą przestrzeń nazwgodziny;

intGłówny()
{
intzidentyfikuj= 8;

Jeśli (zidentyfikuj== 8)
{
koszt<<zidentyfikuj<<' ';
}
powrót 0;
}

Wynik to 8. Istnieją dwa zakresy bloków: blok funkcji main() i zagnieżdżona instrukcja if-compound. Zagnieżdżony blok to potencjalny zakres bloku funkcji main().

Deklaracja wprowadzona w zakresie blokowym nie jest widoczna poza blokiem. Poniższy krótki program, który się nie kompiluje, ilustruje to za pomocą zmiennej variab:

#włączać
za pomocą przestrzeń nazwgodziny;

intGłówny()
{
Jeśli (1 == 1)
{
intzmienna= piętnaście;
}
koszt<<zmienna<<' '; //błąd: dostęp poza jego zakresem.

powrót 0;
}

Kompilator generuje komunikat o błędzie dla zmiennej.

Wprowadzona encja, zadeklarowana w nagłówku funkcji złożonej, nie może być widoczna poza (pod) instrukcją złożoną. Poniższy kod pętli for nie skompiluje się, co spowoduje wyświetlenie komunikatu o błędzie:

#włączać
za pomocą przestrzeń nazwgodziny;

intGłówny()
{
dla (inti=0;i<4; ++i)
{
koszt<<i<<'';
}
koszt<<i<<'';

powrót 0;
}

Zmienna iteracji i jest widoczna wewnątrz bloku pętli for, ale nie poza blokiem pętli for.

Zakres funkcji

Parametr funkcji jest widoczny w bloku funkcyjnym. Jednostka zadeklarowana w bloku funkcyjnym jest widziana od momentu deklaracji do końca bloku funkcyjnego. Poniższy krótki program ilustruje to:

#włączać
#włączać
za pomocą przestrzeń nazwgodziny;

ciąg fn(str)
{
zwęglaćspięć[] = 'banany';
/*inne stwierdzenia*/
string totalStr=P+spięć;
powróttotalStr;
}

intGłówny()
{
ciąg totStr=fn('jedzenie ');
koszt<<totStr<<' ';

powrót 0;
}

Dane wyjściowe to:
jedzenie bananów

Uwaga: Obiekt zadeklarowany poza funkcją (powyżej) można zobaczyć na liście parametrów funkcji, a także w bloku funkcyjnym.

Etykieta

Zakres etykiety to funkcja, w której się pojawia. Poniższy kod ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

próżniafn()
{
iść dolabl;
/*inne stwierdzenia*/
labl: intnie= 2;
koszt<<nie<<' ';
}

intGłówny()
{
fn();

powrót 0;
}

Wyjście to 2.

Zakres wyliczenia

Wyliczenie bez zakresu
Rozważ następujący blok if:

Jeśli (1==1)
{
wyliczenie {a, b, c=b+2};
koszt<<do<<''<<b<<''<<C<<' ';
}

Wyjście to 0 1 3.

Pierwszy wiersz w bloku to wyliczenie, a, b i c to jego enumeratory. Zakres modułu wyliczającego rozpoczyna się od punktu deklaracji do końca otaczającego bloku wyliczenia.

Poniższa instrukcja nie zostanie skompilowana, ponieważ punkt deklaracji c jest późniejszy niż punkt a:

wyliczenie {do=C+2, pne};

Poniższy segment kodu nie zostanie skompilowany, ponieważ moduły wyliczające są dostępne po bloku obejmującym wyliczenie:

Jeśli (1==1)
{
wyliczenie {a, b, c=b+2};
}
koszt<<do<<''<<b<<''<<C<<' '; //błąd: poza zakresem

Powyższe Wyliczenie jest opisane jako Wyliczenie bez zakresu, a jego moduły wyliczające są opisane jako Moduły wyliczające bez zakresu. Dzieje się tak, ponieważ zaczyna się tylko od słowa zastrzeżonego, enum. Wyliczenia, które zaczynają się od klasy enum lub struktury enum, są opisane jako wyliczenia w zakresie. Ich moduły wyliczające są opisane jako moduły wyliczające w zakresie.

Wyliczenie w zakresie
Poniższe stwierdzenie jest w porządku:

wyliczenie klasamężczyzna{a, b, c=b+2};

To jest przykład wyliczenia w zakresie. Nazwa klasy to nazwa. W tym miejscu zakres modułu wyliczającego zaczyna się od punktu deklaracji do końca definicji wyliczenia, a nie od końca bloku otaczającego dla wyliczenia. Poniższy kod nie skompiluje się:

Jeśli (1==1)
{
wyliczenie klasamężczyzna{a, b, c=b+2};
koszt<<do<<''<<b<<''<<C<<' '; //błąd: poza zasięgiem klasy enum lub struktury enum
}

Zakres klasy

Przy normalnym określaniu zakresu region deklaratywny zaczyna się od punktu, a następnie kontynuuje i kończy się w innym punkcie. Zakres istnieje w jednym ciągłym regionie. Dzięki klasie zakres jednostki może znajdować się w różnych regionach, które nie są ze sobą połączone. Nadal obowiązują zasady dotyczące bloków zagnieżdżonych. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

//Klasa bazowa
klasaCla
{
prywatny:
intmemP= 5;
chroniony:
intmemPro= 9;
publiczny:
próżniafn()
{
koszt<<memP<<' ';
}
};

//Klasy pochodnej
klasaDerCla: publicznyCla
{
publiczny:
intderMem=memPro;
};
intGłówny()
{
Cla obj;
obj.fn();
DerCla derObj;
koszt<<derObj.derMem<<' ';

powrót 0;
}

Dane wyjściowe to:
5
9

W klasie Cla zmienna memP jest widoczna w miejscu deklaracji. Następnie krótki fragment chronionego jest pomijany, a następnie ponownie widziany w bloku funkcyjnym elementu klasy. Klasa pochodna jest pomijana, a następnie ponownie widziana w zakresie (bloku) funkcji main().

W klasie Cla w miejscu deklaracji widoczna jest zmienna memPro. Część funkcji publicznej fn() jest pomijana, a następnie widoczna w bloku opisu klasy pochodnej. Widać to ponownie w funkcji main().

Operator Rozdzielczości Zakresu
Operatorem rozpoznawania zakresu w C++ jest :: . Służy do uzyskiwania dostępu do statycznego członka klasy. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

klasaCla
{
publiczny:
statyczny int stałyja ja= 5;
publiczny:
statyczny próżniafn()
{
koszt<<ja ja<<' ';
}
};
intGłówny()
{
koszt<<Cla::ja ja<<' ';
Cla::fn();

powrót 0;
}

Dane wyjściowe to:
5
5

Elementy statyczne są widoczne w bloku funkcji main(), do którego dostęp uzyskuje się za pomocą operatora rozpoznawania zakresu.

Zakres parametrów szablonu

Normalny zakres nazwy parametru szablonu zaczyna się od momentu deklaracji do końca jej bloku, jak w poniższym kodzie:

szablon<Wpisz imięT,Wpisz imięU> strukturaWieczność
{
T John= jedenaście;
Ty Piotrze= 12,3;
T Mary= 13;
U Radość= 14,6;
};

U i T są widoczne w bloku.

W przypadku prototypu funkcji szablonu zakres zaczyna się od punktu deklaracji do końca listy parametrów funkcji, jak w poniższej instrukcji:

szablon<Wpisz imięT,Wpisz imięU> próżniafunkcjonować(Ty nie, ty, tystały zwęglać *P);

Natomiast jeśli chodzi o opis klasy (definicję), to zakres może składać się również z różnych części, jak w poniższym kodzie:

#włączać
za pomocą przestrzeń nazwgodziny;

szablon<klasaT,klasaU> klasaTheCla
{
publiczny:
t liczba;
statycznyU ch;

próżniafunkcjonować(Ojcze,stały zwęglać *P)
{
koszt << 'Są ' <<na jednego<< ' książki warte ' <<nie<<P<< ' w sklepie.' << ' ';
}
statyczny próżniazabawa(U ch)
{
Jeśli (ch== 'do')
koszt << „Oficjalna statyczna funkcja składowa” << ' ';
}
};

intGłówny()
{
TheCla<int,zwęglać>obiekt;
obj.na jednego = 12;
obj.funkcjonować(„$”,'500');

powrót 0;
}

Ukrywanie nazwy

Przykład ukrywania nazw występuje, gdy nazwa tego samego typu obiektu jest ponownie zadeklarowana w zagnieżdżonym bloku. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

próżniafn()
{
intgdzie= 3;
Jeśli (1==1)
{
intgdzie= 4;
koszt<<gdzie<<' ';
}
koszt<<gdzie<<' ';
}

intGłówny()
{
fn();
powrót 0;
}

Dane wyjściowe to:
4
3

Dzieje się tak, ponieważ zmienna w bloku zagnieżdżonym ukryła zmienną w bloku zewnętrznym.

Możliwość powtórzenia deklaracji w tym samym zakresie

Punktem deklaracji jest wprowadzenie nazwy (po raz pierwszy) w jej zakresie.

Prototyp funkcji
Różne jednostki, nawet różnych typów, zwykle nie mogą być deklarowane w tym samym zakresie. Jednak prototyp funkcji można zadeklarować więcej niż raz w tym samym zakresie. Poniższy program z dwoma prototypami funkcji i odpowiednią definicją funkcji ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

próżniafn(intna jednego);
próżniafn(intna jednego);

próżniafn(intna jednego)
{
koszt<<na jednego<<' ';
}

intGłówny()
{
fn(5);

powrót 0;
}

Program działa.

Przeciążone funkcje
Funkcje przeciążone to funkcje o tej samej nazwie, ale o różnych sygnaturach. Jako inny wyjątek przeciążone funkcje o tej samej nazwie można zdefiniować w tym samym zakresie. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeń nazwgodziny;

próżniafn(intna jednego)
{
koszt<<na jednego<<' ';
}

próżniafn(pływaknie)
{
koszt<<nie<<' ';
}

intGłówny()
{
fn(5);
pływakflt= 8,7;
fn(flt);

powrót 0;
}

Dane wyjściowe to:
5
8,7

Przeciążone funkcje zostały zdefiniowane w zakresie globalnym.

Zakres przestrzeni nazw

Zakres przestrzeni nazw zasługuje na swój własny artykuł. Wspomniany artykuł został napisany dla tej witryny, linuxhint.com. Wystarczy wpisać wyszukiwane słowa Zakres przestrzeni nazw w polu wyszukiwania tej witryny (strony) i kliknąć OK, a otrzymasz artykuł.

Zakres w różnych porcjach

Klasa nie jest jedynym schematem, w którym zakres może być w różnych częściach. Specyfikator zaprzyjaźniony, pewne zastosowania specyfikatora-opracowanego typu i dyrektywy using to inne schematy, w których zakres znajduje się w różnych miejscach – po szczegóły, zobacz dalej.

Wniosek

Zakres to region deklaratywny. Region deklaratywny to największa część tekstu programu, w której obowiązuje nazwa podmiotu. Można go podzielić na więcej niż jedną część zgodnie z pewnymi schematami programowania, takimi jak zagnieżdżone bloki. Części, które nie mają punktu deklaracji, tworzą potencjalny zakres. Potencjalny zakres może, ale nie musi mieć deklaracji.