Zakładając, że wielkość typu char to jeden bajt, short to dwa bajty, a double to osiem bajtów, jaka jest wartość wyrażenia sizeof(x), gdzie x jest zmienną poniższego typu strukturalnego, dla standardowych ustawień kompilatora 32-bitowego?
struct{
char c;
short i;
double d;
}x;
sizeof(x) = 1 + padding(1) + 2 + 8 = 12
8+8+8=24
1+4+8=13
sizeof(x) = 1 + padding(1) + 2 + 8 = 12
Przeanalizuj poniższą deklarację. Jakie wartości wyrażeń, w których występują wskaźniki p1 i p2 zostaną wydrukowane? (Załóż, że używasz 32-bitowego kompilatora.)
int t [10];
int∗p1=&t [0];
int∗p2=&t [8];
Przeanalizuj poniższą deklarację w języku C:
int(∗x)(int,int);
Deklaracja jest niezgodna ze składnią języka
Deklaracja wskaźnika na funkcję przyjmującą jako parametr dwa integery i zwracająca inta
Deklaracja wskaźnika na funkcję przyjmującą jako parametr dwa integery i zwracająca inta
Które stwierdzenia dotyczące operatorów w języku C/C++ są poprawne:
Wyrażenie z==++z jest zawsze fałszywe dla zmiennej z typu int.
Operatory addytywne maja˛mniejszy priorytet niz multiplikatywn
Operatory addytywne maja˛mniejszy priorytet niz multiplikatywn
Które stwierdzenia dotyczące modyfikatora static w języku C/C++ są poprawne:
W metodzie poprzedzonej modyfikatorem static możemy używać wyłącznie zmiennych zadeklarowanych jako static.
Pole static klasy C++wymaga zadeklarowania zmiennej w analogiczny sposób, jak deklaruje się zmienne globalne wewnątrz modułów
W funkcji poprzedzonej modyfikatorem static możemy używać wyłącznie zmiennych zadeklarowanych jako static.
W metodzie poprzedzonej modyfikatorem static możemy używać wyłącznie zmiennych zadeklarowanych jako static.
Pole static klasy C++wymaga zadeklarowania zmiennej w analogiczny sposób, jak deklaruje się zmienne globalne wewnątrz modułów
Dzięki konwencji wywołania funkcji w języku C znanej jako __cdecl możliwa jest implementacja funkcji o zmiennej liczbie argumentów, jak printf(). Które stwierdzenia charakteryzujące funkcje typu __cdecl są prawdziwe?
W języku C kompilator może utworzyć kod wywołania funkcji typu __cdecl nie mając informacji o typach jej parametrów
W wygenrowanym kodzie wywołania funkcji argumenty umieszczane są na stosie od konca. Dzięki temu na szczycie stosu jest jej pierwszy argument i analizuja˛c jego zawarto´sc mo˙zna okre´sli´c spodziewana˛ liczbe˛ argumentów wywołania
W języku C kompilator może utworzyć kod wywołania funkcji typu __cdecl nie mając informacji o typach jej parametrów
W wygenrowanym kodzie wywołania funkcji argumenty umieszczane są na stosie od konca. Dzięki temu na szczycie stosu jest jej pierwszy argument i analizuja˛c jego zawarto´sc mo˙zna okre´sli´c spodziewana˛ liczbe˛ argumentów wywołania
W jaki sposób przekazywany jest parametr będący tablicą do funkcji w języku C, np.:
int main(int argc , char ∗ argv [ ]) {
/ / . . .
}
Cała zawartość tablicy kopiowana jest na stos i funkcja działa na kopii tablicy.
Na stosie umieszczany jest adres pierwszego elementu tablic
Na stosie umieszczany jest adres pierwszego elementu tablic
Które stwierdzenia odnoszące się do przydziału pamięci dla zmiennych w językach C i C++ są prawdziwe?
Pamięć dla wszystkich zmiennych przydzielana jest na stosie.
Przydział pamięci dla zmiennych deklarowanych z modyfikatorem static następuje przed rozpoczęciem wykonania programu
Przydział pamięci dla zmiennych deklarowanych z modyfikatorem static następuje przed rozpoczęciem wykonania programu
Które ze stwierdzeń odnoszących się do referencji w języku C++ są poprawne?
Poniższy kod inicjalizacji pola klasy typu referencyjnego jest poprawny class A { int&r; public : A(int&a) : r(a){ } } ;
Ponizszy kod w poprawny sposób przenosi referencje˛ z obiektu a na b: A a; A b; A&r = a; r = b ;
Poniższy kod inicjalizacji pola klasy typu referencyjnego jest poprawny class A { int&r; public : A(int&a) : r(a){ } } ;
Jeżeli podczas wykonania instrukcji w C++:
A∗ ptr = new A ( );
wygenerowany został wyjątek, jego przyczyna może być następująca:
Brakuje pamięci wtedy mechanizm C++ rzuca wyjątkiem std::bad_alloc
Klasa A jest klasa˛abstrakcyjna˛i nie można utworzyć obiektu tej klasy.
W konstuktorze wyrzucany jest wyjątek
Podczas inicjalizacji obiektu wystąpił błąd i konstruktor zwrócił wartość 0.
Brakuje pamięci wtedy mechanizm C++ rzuca wyjątkiem std::bad_alloc
W konstuktorze wyrzucany jest wyjątek
Przeanalizuj fragment kodu w języku C++, w którym pojawia się wywołanie operatora «
A a ;
std : : cout <
Zdefiniowano szablon (wzorzec) funkcji:
template
T suma ( T∗ table, int size)
{
T t =T () ;
for ( int i = 0; i < size ; i ++ ) t += table [i] ;
return t ;
}
Proces instancjacji szablonu polega na zastąpieniu typów i zmiennych będących parametrami szablonu konkretnymi typami i wartościami, a następnie generacji kodu wynikowego. Jakie założenia musi spełniać typ T, aby instancjacja szablonu była możliwa?
Typem T użytym podczas instancjacji szablonu może być typ wbudowany (int, char, float, double)
Zeby mozna było wywołac szablon funkcji parametrem może klasa która posiada domyślny konstruktor oraz przeciążony operator +=
Zeby mozna było wywołac szablon funkcji parametrem może być typem prostym
Typem T użytym podczas instancjacji szablonu może być typ wbudowany (int, char, float, double)
Zeby mozna było wywołac szablon funkcji parametrem może klasa która posiada domyślny konstruktor oraz przeciążony operator +=
Zeby mozna było wywołac szablon funkcji parametrem może być typem prostym
Szablon set zdefiniowany w standardowej bibliotece C++ (STL) przechowuje elementy w drzewiastych strukturach danych. Który z przedstawionych typów danych może być zastosowany jako parametr instancjacji szablonu set?
jeśli podamy przy tworzeniu kolekcji własny komperator setkolekcja;
Typ string
Każdy typ, który ma przeładowany operator <
jeśli podamy przy tworzeniu kolekcji własny komperator setkolekcja;
Typ string
Każdy typ, który ma przeładowany operator <
Które ze stwierdzeń odnoszących się do konstruktorów kopiujących i operatorów przypisania w języku C++ są poprawne?
Publiczny konstruktor kopiujący oraz operator przypisania zostaną automatycznie wygenerowane przez kompilator, jeśli programista je pominie.
Standardowa implementacja (automatycznie wygenerowana przez kompilator) konstruktora kopiującego C++ kopiuje kolejne bajty składające się na pamięć obiektu.
Zarówno automatycznie wygenerowany konstruktor kopiujący, jak i operator przypisania kopiująobiekty bit po bicie.
Publiczny konstruktor kopiujący oraz operator przypisania zostaną automatycznie wygenerowane przez kompilator, jeśli programista je pominie.
Standardowa implementacja (automatycznie wygenerowana przez kompilator) konstruktora kopiującego C++ kopiuje kolejne bajty składające się na pamięć obiektu.
Zarówno automatycznie wygenerowany konstruktor kopiujący, jak i operator przypisania kopiująobiekty bit po bicie.
Implementacja przeciążonych operatorów C++ powinna odzwierciedlać semantykę operacji na typach wbudowanych. Biorąc pod uwagę to wymaganie, które z implementacji operatorów dla klasy X zadeklarowanej poniżej jest poprawna?
class X
{
friend X&operator += (X&a ,const X&b ) ;
int x ;
public :
X(int _x = 0 ) : x ( _x) { }
X&operator + (const X&o ) ;
X&operator ++ (int) ;
X&operator −=(const X&o) ;
} ;
X& operator ++(int );
X&X : : operator −=(const X&o ) {X ret =∗ this; ret.x−=o.x ; return ret ; }