Temat: Reguły zasięgu, zasłanianie nazw, obszary nazw
Cel ćwiczenia:
Umiejętność posługiwania się zakresem ważności i czasem życia zmiennych (obiektów).
Poznanie reguł zasięgu obiektów.
Nowe zagadnienia:
zakres ważności nazwy obiektu a czas życia obiektu, zmienna lokalna, zmienna globalna
reguły zasięgu,
zasłanianie nazw,
operator rozróżniania zasięgu ::
obszary nazw.
Definicje nowych pojęć:
Zakres ważności nazwy obiektu - to ta część programu, w której nazwa jest znana kompilatorowi.
Czas życia obiektu - to okres od momentu, gdy zostaje on zdefiniowany (definicja przydziela mu miejsce w pamięci) - do momentu, gdy przestaje on istnieć (jego miejsce w pamięci zostaje zwolnione).
Jaka jest różnica?
Różnica między powyższymi pojęciami jest taka, że w jakimś momencie obiekt może istnieć, ale nie być dostępny. To dlatego, że np. znajdujemy się chwilowo poza zakresem ważności jego nazwy.
Zasięg pliku - identyfikator jest dostępny we wszystkich funkcjach od miejsca, w którym został zadeklarowany, aż do końca pliku.
Przykład: wszystkie zmienne globalne, definicje funkcji i jej prototypy umieszczone poza funkcją.
Zasięg funkcji - jedynymi identyfikatorami mającymi zasięg funkcji są etykiety. Etykiety mogą być używane gdziekolwiek w funkcji, w której się pojawiają, ale nie są dostępne spoza ciała tej funkcji
Przykład: etykiety w strukturach switch (jako etykiety case) i etykiety w wyrażeniach goto.
Zasięg prototypu funkcji - jedynymi identyfikatorami mającymi zasięg prototypu funkcji są identyfikatory użyte na jej liście parametrów. Prototypy funkcji nie wymagają nazw na liście parametrów - wymagane są tylko typy.
Zasięg bloku - identyfikatory zadeklarowane wewnątrz bloku. Zasięg bloku rozpoczyna się w miejscu deklaracji identyfikatora i kończy w momencie napotkania prawego nawiasu klamrowego }.
Przykład: zmienne lokalne w funkcji, parametry funkcji, dowolne zmienne w bloku {}, itp.
Zasięg klasy - omówiony zostanie podczas omawiania klas.
ZALECENIE: Staraj się unikać korzystania z takich samych nazw identyfikatorów (zmiennych)
w programie!!! (problemy z „zasłanianiem” nazw)
#include <iostream>
using namespace std;
int x=1; //definicja zmiennej globalnej
int main()
{
cout<<x<<endl;
{ //otwarcie bloku lokalnego
int x=2; //definicja zmiennej lokalnej
ekran
cout<<x<<endl; //zmienna lokalna zasłania globalną
cout<<::x<<endl; //tylko dla zasłoniętego obiektu globalnego
} //zamknięcie bloku
cout<<”Poza blokiem, ”<<x<<endl;
system(„PAUSE”);
return 0;
}
Obszary nazw (relatywnie nowa cecha C++) są przeznaczone dla programistów do pomocy w rozwijaniu nowych elementów programu bez wywoływania konfliktów nazw z istniejącymi elementami oprogramowania.
Każdy plik nagłówkowy w projekcie standardu C++ używa obszaru nazw nazywanego std. Projektanci nie powinni używać obszaru std do definiowania nowych bibliotek klas.
Instrukcja using namespace std mówi nam, że używamy elementów oprogramowania z biblioteki standardowej C++.
Instrukcja using umożliwia nam używanie krótkich wersji każdej nazwy w bibliotece standardowej C++ lub jakimkolwiek, określonym przez programistę obszarze nazw namespace.
Jeżeli używamy dwóch lub więcej bibliotek klas, które mają opisy z identycznymi nazwami, może wystąpić konflikt nazw. Należy wtedy w pełni określić nazwę, jakiej chcemy użyć z jej obszarem nazw za pomocą
operatora rozróżniania zasięgu ::.
#include <iostream>
namespace student1
{
int x=1;
int x1=1;
}
namespace student2
{
int x=2;
int x2=2;
}
using namespace std;
using namespace student1;
using namespace student2;
int main()
{
cout<<student1::x<<endl; ekran
cout<<student2::x<<endl;
cout<<x1<<endl;
cout<<x2<<endl;
system (“PAUSE”);
return 0;
}
Zadania C++ - 11
1. Zdefiniuj cztery stałe tekstowe (stringi) o takiej samej nazwie, w następujących czterech różnych zakresach:
a) w dowolnym wymyślonym przez Ciebie obszarze nazw,
b) w zakresie globalnym (zakres pliku),
c) w zakresie lokalnym funkcji głównej programu (main),
d) w dowolnym lokalnym zakresie bloku,
a następnie wyświetl wszystkie napisy na ekran wewnątrz lokalnego zakresu bloku (punkt d). Treść napisu powinna charakteryzować zasięg, w którym napis został zdefiniowany, np.:
”To jest napis zdefiniowany w zakresie ... ”
2. Napisz program, w którym definiujesz dwa obszary nazw student1 i student2. W obszarach tych zdefiniuj następujące dane dotyczące dwóch studentów, tj.Twoje w obszarze student1 , a sąsiada w obszarze student2:
imię, nazwisko, wiek, nr_komputera, przy którym dana osoba siedzi. Wyświetl te informacje na ekran.
3. Napisz program, w którym definiujesz dwa obszary nazw tab_int i tab_char. Zdefiniuj w tych obszarach dwie 10-elementowe tablice, odpowiednio liczb całkowitych oraz znakową (z pojedynczymi znakami), dowolnie przez Ciebie zainicjalizowane. W głównej funkcji programu napisz procedurę realizującą wyszukiwanie największego i najmniejszego elementu w tych tablicach.
Ćwiczenia laboratoryjne nr 11
„Język programowania” str.1
1
2
1
Poza blokiem, 1
Naciśnij dowolny ..
1
2
1
2
Naciśnij dowolny kk