1. Mamy definicje czterech klas: class A1 {public: A1() {cout<<"a1";}}; class A2 : private A1 {public: A2() {cout<<"a2";}}; class A3 {public: A3()

Podobne dokumenty
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Programowanie 2. Język C++. Wykład 3.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Programowanie Obiektowe i C++

Wykład 8: klasy cz. 4

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Dziedziczenie jednobazowe, poliformizm

Programowanie obiektowe w C++ Wykład 12

Programowanie Obiektowe i C++

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

TEMAT : KLASY DZIEDZICZENIE

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie 2. Język C++. Wykład 9.

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Materiały do zajęć VII

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Imię i nazwisko: PYTANIA I ODPOWIEDZI Nr 0 EGZAMIN Język C++ 27 czerwca 2011

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Zaawansowane programowanie w C++ (PCP)

Wykład 4: Klasy i Metody

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Szablony funkcji i szablony klas

Przekazywanie argumentów wskaźniki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Język C++ Różnice między C a C++

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Język C++ Programowanie obiektowe

Obsługa wyjątków. Język C++ WW12

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Język C++ wykład VIII

Szablony klas, zastosowanie szablonów w programach

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wstęp do Programowania 2

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie obiektowe w języku

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 2

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Plik klasy. h deklaracje klas

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wprowadzenie do szablonów szablony funkcji

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język C++ zajęcia nr 2

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Wprowadzenie do szablonów szablony funkcji

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Mechanizm dziedziczenia

Programowanie, część I

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie, część I

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Wykład 5: Klasy cz. 3

Podstawy programowania skrót z wykładów:

Dziedziczenie. Ogólna postać dziedziczenia klas:

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

obiekty funkcyjne - funktory

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Paradygmaty programowania. Paradygmaty programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Projektowanie klas c.d. Projektowanie klas przykład

Operatory na rzecz typu TString

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP)

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Transkrypt:

1. Mamy definicje czterech klas: class A1 {public: A1() {cout<<"a1";} class A2 : private A1 {public: A2() {cout<<"a2";} class A3 {public: A3() {cout<<"a3";} class A4 : A3, virtual public A2 {public: A4() {cout<<"a4";} Co zobaczymy na ekranie w przypadku poniŝszego kawałka programu? void f() {static A4 p0;} static A3 p1; int main(){ A1 p2; f(); } a. A1 A2 A3 A3 A1 A4 b. A3 A1 A2 A4 A3 A1 c. A3 A1 A1 A2 A3 A4 d. A3 A1 A2 A3 A4 A1 2. Jaką wartość będzie miała zmienna a w wyniku poniŝszego przypisania? int b = 1; int a = --b? b : (b = -10)? 4 : 5; a. 0 b. -10 c. 4 d. 5 3. W której linijce zapis jest niepoprawny, jeśli T jest nazwą typu? T obiekt; // obiekt typu T da się utworzyć /* 1 */ const T& const ref = obiekt; /* 2 */ T const& ptr = obiekt; /* 3 */ T const *ptr = &obiekt ; /* 4 */ T const * const ptr = &obiekt; a. tylko 1 b. 1 oraz 2 c. 1 oraz 4 d. wszystkie są niepoprawne 4. Co zobaczymy na ekranie w wyniku wywołania funkcji f, jak poniŝej? void f(int*& c) { c=c+2; cout << *c+1 << endl; } // definicja // gdzieś w programie int* tab = new int[4]; tab[0] = 4; tab[1] = 3; tab[2] = 2; tab[3] = 1; f(tab); // to jest interesujące nas wywołanie a. 1 b. 2 c. 3 d. 4 5. Spośród poniŝszych zdań na temat modyfikatora static wybierz to, które jest fałszywe: a. obiekt statyczny jest widoczny tylko w swojej jednostce translacji b. statyczna stała typu całkowitego, będąca składową klasy, jest inicjalizowana juŝ w ciele klasy c. obiekty statyczne umieszczone w róŝnych plikach inicjalizowane są w kolejności włączenia tych plików do pliku binarnego (biblioteki, programu) d. static odnosi się do obiektu lub funkcji 6. Posiadając cztery poniŝsze przeciąŝone wersje funkcji fun: void fun(int& x) { cout<<"fun_int "; } void fun(float x) { cout<<"fun_float "; } template <typename T> void fun(t x) { cout<<"fun_t "; } template <> void fun(double& x) { cout<<"fun_double "; } co zobaczymy na ekranie w wyniku następujących dwóch wywołań: fun(1.3); fun(1); a. fun_float fun_int b. fun_t fun_t c. fun_double fun_int d. fun_float fun_t 7. Wyobraź sobie klasę A dziedziczącą z B i zarówno A jak i B mają bezargumentowe konstruktory. Aby wywołać konstruktor B z A, uŝyj: a. A() : B() { } b. A() : { B(); } c. B() : A() { } d. B() : { A(); } 8. W wyniku wykonania poniŝszego fragmentu kodu, na ekranie zobaczymy: auto_ptr<int*> a(new int*); *a = new int(7); cout << **a-1 << endl;

a. 7 b. nic, bo szablon auto_ptr naleŝy tu uŝyć z argumentem <int> c. przypadkową wartość, bo tablice dynamicznie kreowane nie są inicjalizowane Ŝadną początkową wartością d. 6 9. Mamy poniŝej definicje czterech klas, jedna zawiera błąd i się nie skompiluje. Która? class A { public: A(int n=0) { } const static A a; A const A::a; class C { public: C() : c(0) { } const C* c; class B { public: B() : b(*this) { } B& b; class D { public: D(int n=0) : d(0) { } const D d; a. klasa A się nie skompiluje b. klasa B się nie skompiluje c. klasa C się nie skompiluje d. klasa D się nie skompiluje 10. Pewien student przeciąŝył operator<< w postaci funkcji składowej klasy A: class A { int x; public: A(int n=0) : x(n) {} ostream& operator<<(ostream& o) { o << x; } Utowrzył w programie dwa obiekty: A a(4), b(5); Wybierz, która z linijek w programie mu się skompiluje i zadziała: a. cout << a << b; b. b << a << cout; c. a << cout << b; d. a << (b << cout); 11. Z poniŝej podanych zestawów wybierz ten, w którym wymieniono tylko operatory, które przy przeciąŝeniu muszą być funkcjami składowymi: a. [] () ->.* b. -> = ->*, c. () = -> ->* d. = [] -> () 12. Zdefiniowano następujące wielkości: int i; int &r = i; int *rp = &i; const int n = i; const int& rn = n; const int* pn = &n; const int* const pnc = &n; Następnie wykonano cztery porównania badające typ zmiennych z pomocą techniki RTTI (rozpoznawania typu podczas wykonania): typeid(i)==typeid(r), typeid(n)==typeid(rn), typeid(pn)==typeid(pnc), typeid(i)==typeid(n) Ile z tych porównań da wynik prawdziwy (true)? a. 1 b. 2 c. 3 d. 4 13. Mamy obiekt typu lista, na przykład list<int> l; Z poniŝszych operacji wybierz tą, która jest prawidłowa: a. list<int>::iterator it = l.begin()+1; b. sort( l.begin(), l.end() ); c. list<int>::const_reverse_iterator it = l.rend(); d. random_shuffle( l.begin(), l.end() ); 14. Klasa B dziedziczy publicznie z klasy A. Definiujemy w klasie B operator przypisania B& operator=(const B& b) i w jego treści na początku chcemy wykorzystać wywołanie operatora przypisania z klasy bazowej. Wśród poniŝszych odpowiedzi wskaŝ tą, która jest nieprawidłowa: a. A::operator=(b); b. A &ref = *this; ref = b; c. A *ptr = &b; d. this->a::operator(b); 15. Wskaźniki do składowych klasy definiuje się zwykle poza ciałem klasy. Pewien student zdefiniował ten wskaźnik wewnątrz klasy jako pole statyczne, w taki oto sposób:

class A { public: A() : a(76), b(65) {} static int A::*ptr; int a, b; int A::*A::ptr = &A::b; // definicja pola statycznego Z poniŝszych operacji wskaŝ tą, która jest poprawnym uŝyciem (wyłuskaniem) wskaźnika ptr i wypisze na ekranie wartość przechowywaną w zmiennej b (tzn. 65), jeśli w programie najpierw utworzymy wskaźnik do obiektu typu A: A *ptra = new A; a. cout << ptra->*ptra->ptr; b. cout << ptra->(*ptr); c. cout << *(ptra->ptr); d. cout << (*ptra).ptr; 16. Klasa A ma zdefiniowane takie pola: int& a; int* b; const int c; int const *d; static int e; przy czym składowa statyczna jest oczywiście zdefiniowana poza ciałem int A::e; WskaŜ z poniŝszych niepoprawny konstruktor: a. A() : a(e), c(e) {} b. A() : d(0), c(7), b(0), a(e) {} c. A() : a(e), c(0), d(&e) {} d. A() : a(0), c(0) {} 17. Spośród poniŝszych słów wskaŝ to, które nie jest słowem kluczowym języka C++ a. explicit b. goto c. exception d. union 18. Gdzieś w programie widzisz taką linijkę: A::fun(); Wybierz z poniŝszych komentarzy opisujących potencjalne moŝliwości, jeden niepoprawny. a. fun() jest statyczną funkcją składową klasy A b. fun jest statycznym obiektem typu A zdeklarowanym wewnątrz klasy A, potem zdefiniowanym, ponadto klasa ta ma odpowiedni przeciąŝony operator() c. fun() jest funkcją zamkniętą w przestrzeni nazw A d. fun jest globalnym statycznym obiektem typu A i w klasie tej jest przeciąŝony operator() 19. Wśród poniŝszych stwierdzeń wskaŝ fałszywe: a. funkcja unexpected jest wołana gdy wyjątek zgłosi konstruktor obiektu globalnego b. funkcja terminate domyślnie wywołuje funkcję abort c. funkcja unexpected domyślnie woła funkcję terminate d. błąd alokowania pamięci domyślnie sygnalizowany jest wyjątkiem bad_alloc 20. Która funkcja z poniŝszych deklaracji gwarantuje, Ŝe nie zgłosi Ŝadnego wyjątku? (jeśli trzeba, funkcja moŝe być składową jakiejś klasy): a. void fun(const exception& e); b. void fun() const throw(bad_exception); c. void fun(void*) throw(); d. void fun(double&) throw(double); 21. Mamy takie oto cztery definicje (wszystkie puste): enum Krakowiak { union Wolowina { struct Pershing { class Rzeznik { Wykorzystano je do zgłoszenia i przechwycenia wyjątku: try { throw Krakowiak(); } catch (Krakowiak&) {cout<<"krakowiak";} try { throw Wolowina(); } catch (Wolowina&) {cout<<"wolowina";} try { throw Pershing(); } catch (Pershing&) {cout<<"pershing";} try { throw Rzeznik(); } catch (Rzeznik&) {cout<<"rzeznik";} WskaŜ, która z poniŝszych odpowiedzi jest poprawna: a. wszystkie przypadki są poprawne i działają b. unia Wolowina nie moŝe być uŝyta jako typ wyjątku c. pusty typ wyliczeniowy Krakowiak nie moŝe być uŝyty jako typ wyjątku d. klasa Rzeznik nie moŝe być uŝyta, bo nie ma zdeklarowanych publicznych konstruktora i destruktora, niezbędnych przy tworzeniu obiektu wyjątku 22. Deklaracje funckji wraz z wartościami domyślnymi parametrów mogą się powtarzać, ale pod pewnymi warunkami. Które z poniŝszych jest błędne? a. void fun(int a, int b, int c=3); void fun(int a, int b, int); b. void fun(int a, int b, int c=3); void fun(int a, int b=2, int c); c. void fun(int a, int b, int c=3); void fun(int=1, int b=2, int c); d. void fun(int a=1, int b, int=3); void fun(int a, int b=2, int c);

23. Który z poniŝszych kawałków kodu jest niepoprawny: a. class A { int n; friend void fun(a &a) { cout << a.n; } b. class A { int n; friend void fun() { cout << n; } c. class A { int n; friend void fun(a &a); void fun(a &a) { cout << a.n; } d. class A { int n; friend void fun(a*); void fun(a *a) { cout << (*a).n; } 24. WskaŜ wśród poniŝszych rad na temat dobrego projektowania obiektowego tą, która nie jest właściwa: a. preferuj kompozycję, a nie dziedziczenie b. dziedzicz interfejsy, a nie implementacje c. jeśli moŝesz, pisz interfejs w oparciu o funkcje wirtualne d. zidentyfikuj co się moŝe zmieniać i ukryj to 25. Co zobaczymy na ekranie (zakładamy uprzednie włączenie wszystkich potrzebnych plików nagłówkowych)? int T[] = {-3, -1, 0, 1, 3 vector<int> vi(t, T+sizeof(T)/sizeof(int)); vector<int>::iterator vit; ostream_iterator<int> out(cout, " "); vit = remove_if(vi.begin(), vi.end(), not1(bind1st(less<int>(),0))); copy(vi.begin(), vit, out); a. 0 1 3 b. 1 3 c. -3-1 0 d. -3-1 26. Dla poniŝszej definicji szablonu funkcji wskaŝ niepoprawne jej wywołanie: template <typename A1, typename A2, typename A3> A1 const& min(a2 const& l, A3 const& r) { return l < r? l : r; } a. min<double>(2.2, 1.1); b. min<double, int, double>(22, 3.14); c. min<bool, bool>(1, false); d. int *p1, *p2; min<int*>(p1, p2); 27. Jeśli mapę wypełnimy jak poniŝej, to co zobaczymy na ekranie? map<string, int> msi; msi["kota"]; msi.insert(pair<string,int>("ala",2)); msi["ma"]++; map<string, int>::iterator itm = msi.begin(); for( ; itm!= msi.end(); ++itm) cout << itm->first << " " << itm->second << " "; a. ala 2 kota 1 ma 2 b. ala 2 ma 1 kota 0 c. ala 2 kota 0 ma 1 d. kota 0 ma 1 ala 2 28. Spośród poniŝszych wskaŝ poprawny predykat: a. class A { public: void operator()(bool p); b. struct A { int operator(int a)(); c. class A { public: bool operator()(double, int); d. struct A { double operator()(); 29. JeŜeli vector<const char*> v; wypełnimy trzema słowami: "ala", "ma", "kota", oraz zdefiniujemy iterator ostream_iterator<const char*> out(cout, " "); to na ekranie w efekcie poniŝszej linii zobaczymy remove_copy_if(v.begin(),v.end(),out,bind1st(ptr_fun(strcmp),"ma")); a. ala b. ala kota c. ala ma d. ma 30. Wybierz prawidłowy opis wzorca dekoratora: a. pozwala na dynamiczne dodanie dodatkowych odpowiedzialności do obieku b. definiuje rodzinę algorytmów, kapsułkuje kaŝdy z nich i czyni wymiennymi c. definiuje interfejs do tworzenia obiektu, ale zleca jego tworzenie podklasom d. słuŝy dokonaniu rozdziału pomiędzy abstrakcją a jej implementacją

31. Jaka liczba zostanie wyświetlona w efekcie działania poniŝszego kawałka kodu: char T[] = {1,2,3,4,5,6,7,8 cout << *(reinterpret_cast<short*>(t) + 2) << endl; a. 1541 b. 3 c. 1027 d. 1286 32. Co zobaczymy na ekranie w efekcie działania poniŝszego kawałka kodu: class A { int n; static int i; public: A() : n(++i) {} int fun() { return n; } int A::i = 0; int main() { int (A::*p)() = &A::fun; A* ptr = new A[3]; cout << (*((++ptr)++).*p)() << endl; } a. kod się nie skompiluje, bo w ostatniej linii jest błąd b. 1 c. 2 d. 3 33. Pewien student przeciąŝył w klasie A operator postinkrementacji i postanowił uŝyć swoje dzieło w nietypowy sposób. Oceń jaki będzie tego efekt: class A { public: A() : x(0) {} // konstruktor A operator++(int) { A temp; ++x; return temp; } // przeciąŝony int x; // gdzieś w programie A obiekt1; obiekt1++++++; cout << obiekt1.x << endl; a. to jest niepoprawne składniowo i się nie skompiluje b. na ekranie zobaczymy liczbę 3 c. na ekranie zobaczymy liczbę 1 d. na ekranie zobaczymy liczbę 0 34. Mamy pewien typ TYP (jest to jakiś wskaźnik), zdefiniowany poprzez typedef: typedef int (*(*const(*typ)())[2])(); Utworzony i poprawnie przypisany zostaje: TYP obiekt. Wybierz z poniŝszych poprawne wywołanie, zgodne ze specyfikacją powyŝszego typu. a. (*(*obiekt)())[1](); b. (*(*obiekt)())()[1]; c. *((*obiekt)())[1](); d. ((*obiekt)(*)())[1](); 35. Przyjrzyj się poniŝszym przykładom tworzenia i inicjalizacji obiektów wraz z komentarzem i wskaŝ tą odpowiedź, która jest niepoprawna: a. int x = 12; { int x = x; } // lokalna zmienna x zostanie zainicjalizowana wartością 12 b. const int i = 2; { int i[i]; } // zostanie utworzona lokalna dwuelementowa tablica int c. const int x = 12; { enum { x = x; } // element typu wyliczeniowego inicjalizowany jest wartością 12 d. struct X { enum E {z=16 int b[x::z]; // poprawne, bo do nazwy składnika klasy moŝna odwołać się od razu po jego wystąpieniu