singlepost

Тест на знание ООП на основе С++ *SAD* << На главную или назад  

Народ, помогите, плиз, ответить на пару вопросов по ООП:

1. Чему эквивалентна запись: #define CONV(A,B) *A,*B
2. Что означает запись: #define swap(a,b) {int a##b=a; a=b, b=a##b;}
3. Почему следуюая запись некорректна: #define swap(a,b) {int a##b=a, a=b; b=a##b;}
4. Что означает запись: #pragma argused
5. Что означает запись: #undef
6. Зачем нужен страж включения при использовании: #include
7. Что означает запись: namespace A {int B; int C;} …; using A::B; A::B=A::C;
8. Что означает запись: asm {…}
9. Чем отличается запись: …; return 5; от записи …; return;
10. Назовите четыре оператора, позволяющие организовать бесконечный цикл, приведите примеры.
11. Что означает запись: T *A = new X*[y];
12. Что означает запись: T **A = new X[y];
13. Что означает запись: void *F(int X) {return (void*)X;} …; void *A=F(5);
14. Что означает запись, чему будет равно А: int& F(int* X) {return *(X+1);} …; int b[3] = {5,6}; int A = F(b);
15. Почему запись некорректна: int A=F(X++);
16. Почему запись некорректна: int **A=new int*[1]; …; delete A;
17. Что означает запись: int ***X[2][3][4];
18. Какие существуют ограничения на X, Y и Z в записи: int D[X][Y][Z];
19. Что означает запись, почему она некорректна: enum S {A,B,C=08,D='\\'} E = 4; …; E=A+1;
20. Что означает запись: void F(/*const int **/const int &) const;//F(5)
21. Что означает запись: int a[6] = {1,2,3,4,5};int y=a[5]+int(a)+5+*a*5;
22. Что означает запись, чему будет равно А: int f(int a, int b=3) {return a *b;} …; int A=f(3,4)+f(4);
23. Что означает запись: int a=5;struct S{int a,b; int F(int a){return a *::a;}} M={2,3}; …; int A=M.F(4);
24. Что означает запись: class X{int* F(int);}; int *X::F(int a){return new int[a];}
25. Что означает запись: class X{int a; public: X(){a=0;} X(int b){a=b;} X(X &c){a=c.a;} };
26. Что означает запись: UNIОN X{int a; signed int b; unsigned int c;} Y;
27. Что означает запись: *(&(A.B.C[5]->X)+3);
28. Что означает запись: (*(A->B.C))->D;
29. Что означает запись: &*A и чем она отличается от записи: *&A
30. Что означает запись: int x=8;void f(){static int x=6;x++;::x=x;} …; int x=5;f();f();::x=x;
31. Чему будет равно А, обяснить почему: int A=5; A=~A; A<<=2; A|=1; A&=5; A^=1;
32. Что означает запись, чему она эквивалентна: inline int F(int X){return X*X;} …; int A=F(5);
33. Чему будут равны C и D, объяснить почему: int A=5,B=7,C=(A&B)^(A&&B),D=~(!0);
34. Упростить запись, избавившись от оператора ",": F(a, (b = 1, b + 4), c);
35. Что означает запись: struct A{int x; A& X(void) {return *this;}} B; B.X().X().X().x = 5;
36. Почему запись некорректна: struct X{const int a; const int& b;}; X Y;

"всего-то" ©)))

________________________
p.s. 26. UNIОN в данном случае пишется с маленькой буквы, ибо по неведомым причинам vkontakte автоматически меняет его регистр

42 ответов в теме “Тест на знание ООП на основе С++ *SAD*”

  1. 42
    Илья Макаров ответил:

    Всем спасибо – действительно было пару заморочистых вопросиков…

  2. 41
    Руслан Гайсумов ответил:

    Огоромное спасибо всем, кто отписался здесь! Вы выручили очень много народа))

  3. 40
    Александр Борисенков ответил:

    спасибо всем, кто напрягал мозги для нас ;)

  4. 39
    Александр Пинский ответил:

    На вопрос №13 уже отвечал Сергей ShTiRLiC Шпикин
    Функция принимает целое число, приводит его к типу "указатель на void" и возщвращает получившийся указатель.
    void *A = F(5);
    Переменная A (указатель) будет указывать на 5-й байт памяти

  5. 38
    DELETED DELETED ответил:

    Несправедливо обделили вниманием следующие вопросы:
    1. Чему эквивалентна запись: #define CONV(A,B) *A,*B
    13. Что означает запись: void *F(int X) {return (void*)X;} …; void *A=F(5);
    20. Что означает запись: void F(/*const int **/const int &) const;//F(5)
    30. Что означает запись: int x=8;void f(){static int x=6;x++;::x=x;} …; int x=5;f();f();::x=x;
    32. Что означает запись, чему она эквивалентна: inline int F(int X){return X*X;} …; int A=F(5);

    вроде всё… судный день – понедельник… систематизирую данные :D
    p.s. всем ОГРОМНОЕ спасибо за помощь! как проверят – обязательно отпишусь
    p.p.s. есть предположение, что этот топик читает вся моя группа, кого смогу заставить – пригоню сюда со словами благодарности :D

  6. 37
    Александр Пинский ответил:

    19. Что означает запись, почему она некорректна: enum S {A,B,C=08,D='\\'} E = 4; …; E=A+1;

    Тут много ошибок
    1. 08 – запись числа с первой цифрой "0" означает запись в восьмеричной системе, в ней используются цифры от 0 до 7, 8 – неправильно
    2. E = 4 – во-первых, отсутствует приведение от инта к энуму, в таком случае нужно писать явный каст. Во-вторых, неопределено, какое из значений энума эквивалентно числу "4"
    3.E = A + 1 – аналогично, отсутствует приведение типов

  7. 36
    Александр Пинский ответил:

    да, это нормально X Y; означает объявление переменной типа X и с именем Y (перед этим тип данных X описан – эта самая структура)

  8. 35
    DELETED DELETED ответил:

    >>36. Почему запись некорректна: struct X{const int a; const int& b;}; X Y;

    первое что бросается в глаза так это связка "X Y;" (Икс пробел Игрек;)
    это вообще нормально? :D

  9. 34
    DELETED DELETED ответил:

    ааа..)))) сэнкс

  10. 33
    DELETED DELETED ответил:

    Вот такой вопрос:
    A = 5 // 0×00000005
    B = 7 // 0×00000007
    A & B // побитовая операция "И", результат равен 0×00000005

    т.е. если оба операнда "true", то он удерживает значение первого, в противном случае 0, так? первая мысль: результат равен 0×0000000С

  11. 32
    Александр Пинский ответил:

    не, true/false тут не при чём – операция побитовая
    младший байт операндов равен:
    A = 0000 0101 //4+1=5
    B = 0000 0111 //4+2+1=7
    теперь помня о том, что 1 И 1 = 1, 1 И 0 = 0, 0 И 0 = 0 полчаем
    0000 0101

  12. 31
    Александр Пинский ответил:

    <Мастер Пинский> :D :D :D я в истерике!!!

    Тогда так:

    33. Чему будут равны C и D, объяснить почему: int A=5,B=7,C=(A&B)^(A&&B),D=~(!0);

    В выражении присутствует смесь побитовых и логических операций
    A = 5 // 0×00000005
    B = 7 // 0×00000007
    A & B // побитовая операция "И", результат равет 0×00000005
    A && B // логическая операция "И", A неравно нулю и B не равно нулю, следовательно оба операнда "true", результат тоже "true", то есть "1", 0×00000001
    ^ // побитовое исключающее ИЛИ (XOR), 0×00000005 ^ 0×0000001 = 0×00000004
    Следовательно C = 4
    !0 //логическое отрицание, 0 – "false", отрицание – "true", т.е. 1, 0×00000001
    ~ //побитовое отрицание ~(0×00000001) = 0xFFFFFFFE, т.е. -2
    Следовательно D = -2
    Итого: C = 4, D = -2

  13. 30
    DELETED DELETED ответил:

    >> Синтаксическая ошибка, не скомпилится.
    >> Может быть в выражении D=~(|0) должена стоять не "|" (вертикальная черта), а "!" (восклицательный знак)? Тогда выражение валидно.
    >> Либо это вопрос с повохом.

    исследовал исходник на качество печати и пришёл к выводу, что тест был напечатан на струйном принтере на обычной бумаге… вывод? капли чернил растеклись по волокнам листа, что повлекло за собой слияния "!" в "|"… хотя до сих пор этот момент трудно различим, но раз Мастер Пинский говорит, что мол "ERROR" и всё тут, то вероянто это действительно так ^^

  14. 29
    Александр Пинский ответил:

    поправка, повыяснял тут – запись корректна (решётка, вроде бы, означает подстановку символического имени параметра макроса).
    Ну а ошибка тут в использовании "," вместо ";" в выражении int a##b=a, a=b;

  15. 28
    Александр Пинский ответил:

    3. Почему следуюая запись некорректна: #define swap(a,b) {int a##b=a, a=b; b=a##b;}

    Ты уверен, что именно a##b (через решётки)? А то как-то странно выглядит конструкция…

  16. 27
    Александр Пинский ответил:

    35. Что означает запись: struct A{int x; A& X(void) {return *this;}} B; B.X().X().X().x = 5;

    Определяется структура A с одним внутренним полем x, и одним методом X, который возвращает ссылку на этот же объект.
    Сразу же объявляется переменная типа этой структуры.
    B.X().X().X() – можно писать сколько угодно последовательных вызовов функции X, каждый раз будет возвращаться ссылка на объект B
    так что B.X().X().X() равно просто B
    B.X().X().X().x = 5; – полю x объекта B присваивается значение 5
    Итого B.x присваивается значение 5 и эта запись эквивалентна просто B.x = 5;

  17. 26
    Александр Пинский ответил:

    33. Чему будут равны C и D, объяснить почему: int A=5,B=7,C=(A&B)^(A&&B),D=~(|0);

    Синтаксическая ошибка, не скомпилится.
    Может быть в выражении D=~(|0) должена стоять не "|" (вертикальная черта), а "!" (восклицательный знак)? Тогда выражение валидно.
    Либо это вопрос с повохом.

  18. 25
    Александр Пинский ответил:

    28. Что означает запись: (*(A->B.C))->D;

    A – указатель на объект, структуру или юнион
    A->B – обращение через указатель к полю B объекта
    B – также является объектом, структурой или юнионом
    A->B.C – обращение к полю C объекта B
    *(A->B.C) – C является указателем, * – обращение к переменной по этому адресу
    (*(A->B.C)) – скобки для приоритета операций
    (*(A->B.C))->D – по адресу C находится другой указатель (тоже на объект, структуру или юнион), через оперецию "->" производится обращение к полю D объекта, на который указывает указатель, находящийся по адресу C

    2 Дарья Кафтан
    Спасибо :) ))

  19. 24
    Александр Пинский ответил:

    34. Упростить запись, избавившись от оператора ",": F(a, (b = 1, b + 4), c);

    Оператор "," описывает последовательное выполнение действий, т.е. сперва b будет присовено значение 1, а потом к нему прибавится 4.
    Соответственно можно написать F(a, 5, c); либо (если значение b нужно где-то дальше в программе), то b = 1; F(a, b + 4, c);

  20. 23
    Дарья Кафтан ответил:

    спасиб. точняк*а!!!! как эт я не догадалося?
    ух молодец Пинский! хвалю!

  21. 22
    DELETED DELETED ответил:

    исправил:
    20. очепятка "constt" —> "const"
    24. в конце была лишняя "};" —> убрал
    26. очепятка "unsidned" —> "unsigned"
    32. очепятка "int F()int X)" —> "int F(int X)"

    p.s. по неведомым причинам, vkontakte автоматически меняет регистр UNIОN

  22. 21
    Александр Пинский ответил:

    31. Чему будет равно А, обяснить почему: int A=5; A=~A; A<<=2; A|=1; A&=5; A^=1;

    Побитовые операции
    int A = 5; // присвоение, A = 0×00000005
    A = ~A;// побитовое отрицание, A = 0xFFFFFFFA
    A<<=2;// сдвиг слево на 2 позиции, A = 0xFFFFFFE8
    A |= 1;// побитовое "ИЛИ" с единицей, A = 0xFFFFFFE9
    A &= 5; // побитовое "И" с пятёркой, A = 0×00000001
    A ^= 1; // исключающее или (XOR) с единицей, A = 0×00000000
    Итого, A равно нулю.

  23. 20
    DELETED DELETED ответил:

    2 Александр Зло Пинский
    >> <вот именно, что в вопросе звучит именно "argused">
    >> Хм, тогда не знаю, что это такое. Это тебе в универе задание дали? >> Может опечатка?

    да)))) кстати, в полне возможно, ибо есть предположение, что препод печатал "ЭТО" из головы))) тогда тут играет "человеческий фактор")

    >>26. Синтаксическа ошибка – слова UNIОN и unsidned неизвестно что такое.

    вот здесь признаюсь, кривые пальцы — моя вина =]
    на всякий случай перепроверю ещё раз…

  24. 19
    Александр Пинский ответил:

    2 Дарья Кафтан

    27. Верно
    29. По-моему наоборот. Хотя не уверен, на C++ давно не писал, а справки под рукой нет.
    30. ХЗ, по-моему это вообще не должно скомпилиться
    36. Вроде верно

  25. 18
    Сергей Шпикин ответил:

    2Макаров Вася: конечно нет, такая строка вполне уместна. Просто вопрос-то стоит "почему некорректна" и как-то странно отвечать "нипочему". В общем, странный вопрос.

    В п.7 я затупил, ага. using вообще можно опустить.

  26. 17
    Александр Пинский ответил:

    26. Синтаксическа ошибка – слова UNIОN и unsidned неизвестно что такое.
    А вот если там UNIОN (маленькими буквами) и unsigned, тогда это означает следующее:
    UNIОN X{int a; signed int b; unsigned int c;} Y;
    Описывается юнион с именем X (юнион, это такая штука, что сколько в ней элементов не напиши, размер будет равен размеру максимального – в данном случае int – а все элементы находятся по рдному адресу в памяти). И сразу же объявляется переменная Y типа X.

    [EDIT]
    Что за нах?!?!?! почему маленькие буквы на большие заменяются в слове u_n_i_o_n?!?!?

  27. 16
    Александр Пинский ответил:

    Пока писал, уже опередили :) ))

  28. 15
    Александр Пинский ответил:

    2 Дарья Кафтан

    21. IMHO не совсем верно – *a*5 не адрес нулевого элемента умножается на 5, а его значение
    22. Верно
    23. Верно
    24. Верно, но дополнение – функция создаёт массив интов размера "a" и возвращает его адрес
    25. По-моему верно

  29. 14
    Дарья Кафтан ответил:

    27. Что означает запись: *(&(A.B.C[5]->X)+3);

    это обращение по адресу, равному сумме адреса икса из це пятого из б из а плюс три.

    29. Что означает запись: &*A и чем она отличается от записи: *&A
    первое – это ссылка на указатель на А, а второе – это указатель на ссылку на А.
    30. Что означает запись: int x=8;void f(){static int x=6;x++;::x=x;} …; int x=5;f();f();::x=x;
    бред…. зачем два раза инициализировать иксюху в одном и том же месте??

  30. 13
    Дарья Кафтан ответил:

    ответьте, я правильно сказала?

  31. 12
    Александр Пинский ответил:

    2 Илья SEMER Ухин

    <вот именно, что в вопросе звучит именно "argused">
    Хм, тогда не знаю, что это такое. Это тебе в универе задание дали? Может опечатка?

    21. Запись int a[6] = {1,2,3,4,5};int y=a[5]+int(a)+5+*a*5; означает следующее:
    int a[6] = {1,2,3,4,5};
    /*
    Объявляется массив из шести элементов
    */
    int y=a[5]+int(a)+5+*a*5;
    /* Выражение вычисляется так:
    1. a[5] – пятый элемент массива
    2. int(a) – приведение "a" к типу int (имя массива равно адресу начала массива)
    3. 5 – просто константа
    4. *a*5 – *a обращение через указатель к переменной по адресу "a" т.е. начало массива, нулевой элемент, *5 умножение значения на пять. Итого, это выражение эквивалентно a[0] * 5 = 1 * 5
    Всё вышеперечисленное суммируется.

    22. Что означает запись, чему будет равно А: int f(int a, int b=3) {return a *b;} …; int A=f(3,4)+f(4);

    f – функция с пареметром со значением по умолчанию (т.е. этот параметр является необязательм и при вызове функции его можно не указывать, тогда он будет иметь значение по умолчанию)
    Сама функция возвращает произведение своих параметров.
    При вычислении выражения функция вызывается один раз с параметрами 3 и 4 (результат 12) и второй раз с одним параметром a = 4, при этом имеет значение по умолчанию – 3, результат снова равен 12, ну а результат всего этого 12 + 12 = 24

  32. 11
    Дарья Кафтан ответил:

    36. Почему запись некорректна: struct X{const int a; const int& b;}; X Y;
    потому что у тебя там две константы с непонятным значением, а так не бывает, ведь потом ты, когда объявляешь игрек, вроде как присваиваешь им что-то новое. это бред. в общем, просто так константы писать не нада

  33. 10
    Дарья Кафтан ответил:

    21. int a[6] = {1,2,3,4,5};int y=a[5]+int(a)+5+*a*5;это значит массив из 6-ти элементов типа интеджер, причем пять ужо указано. а игрек – это сумма пятого элемента с адресом первого эл-та массива плюс пять плюс опять сумма адреса ток умноженного на пять.
    22. Что означает запись, чему будет равно А: int f(int a, int b=3) {return a *b;} …; int A=f(3,4)+f(4);
    функция Эф с двумя целочисленными параметрами причем второй из них по умолчанию равен трем, причем возвращает их произведение =). а А будет равно 24.
    23. Что означает запись: int a=5;struct S{int a,b; int F(int a){return a *::a;}} M={2,3}; …; int A=M.F(4);
    целое а равно пяти. структура С состоит из двух членов а и б и одного метода, возвращающего произведение параметра а на а внешнего простр. элемент эм типа эс причем его члены равны 2 и 3.А равно двадцати.

    24. Что означает запись: class X{int* F(int);}; int *X::F(int a){return new int[a];} };
    класс икс состоящий из одного закрытого метода Эф. причем в классе только прооттип метода, а его объявление – потом, после.
    25. Что означает запись: class X{int a; public: X(){a=0;} X(int b){a=b;} X(X &c){a=c.a;} };
    класс икс с закрытым членом а и открытым конструкторами икс() и икс(инт б) и копирующим конструктором икс(ссылка на объект типа икс)

  34. 9
    DELETED DELETED ответил:

    2"Александр Зло Пинский":
    вот именно, что в вопросе звучит именно "argused"

    p.s. перепроверил ещё раз, добавил вторую часть…

  35. 8
    Михаил Шаханов ответил:

    11.T *A = new X*[y];
    Дословно это означает:
    Объявление переменной А типа "указатель на Т" и присваивание ей указателя на первый элемент вновь созданного массива элементов типа "указатель на Х" размерностью у.
    Примечание: всё эт дело будет работать только если тип Т — "указатель на Х", либо может быть неявно в него преобразован.

    12. T **A = new X[y];
    В принципе то же самое (тип А — "указатель на указатель на Т"), только наоборот — теперь Х должен быть типа "указатель на Т", либо возможно неявное преобразование.

  36. 7
    Макаров Вася ответил:

    14. Я думаю что если использовать ссылку на анонимный экземпляр вне блока, внутри которого он создан, то ничего хорошего не получится

  37. 6
    Макаров Вася ответил:

    15. Сергей ShTiRLiC Шпикин становится ли от этого запись некорректной?

  38. 5
    Макаров Вася ответил:

    17. объявление и статическое выделение трехмерного массива указателей на указатели на указатели на экземпляры типа Х))

  39. 4
    Макаров Вася ответил:

    12. А ну это выделение памяти в куче для массивы из у элементов типа Х, объявление указателя на указтель на экземляр Т и присвоение ему значения адреса первого элемента массива.

  40. 3
    Александр Пинский ответил:

    4. #pragma argsused (а не argused) насколько знаю, пишется перед объявлением функции main в виде main(int argc, char* argv[]) чтобы не было ворнингов, если не используешь эти самые argc и argv.

    7. Работать будет, так как не смотря на то, что using сделан только для B, в выражении A::B=A::C; имя неймспейса указанно явно для обоих переменных (собственно говоря, работать будет и без using A::B;). Ну а означает эта запись следующее: объявляется неймспейс с двумя переменными внутри, делается using одной из переменных (чтобы можно было обращаться к ней без префикса неймспейса, значени одной переменной присваивается другой).

    16. Запись некорректна потому, что выделение памяти было с использованием [] (т.е. массива, хоть и из одного элемента), а освобождение через delete (для одной переменной), нужно использовать delete[] A;

    18. X, Y, Z должны быть целыми положительными числами.

    Сейчас занят, не могу больше писать, потом ещё напишу.

  41. 2
    Алексей Голубев ответил:

    Классный тест… Где взял?

    10. for{;;} {…}
    do {…} while(true);
    while(true) {…}
    metka: …; goto metka;

  42. 1
    Сергей Шпикин ответил:

    Нда, что-то про ООП тут негусто, в основном чисто примочки С++.

    2. Видимо, обмен значениями двух переменных.
    5. Отмена определения того, что было определено через #define.
    6. Чтобы избежать двойного включения одного и того же хедера, что приведет к дупликации деклараций и неоднозначностям.
    7. Не будет работать, т.к. using сделан только для переменной B из неймспейса A, но не для C.
    8. Ассемблерная вставка.
    9. Первая возвращает значение из функции, вторая нет. Первая применяется, когда у функции есть возвращаемое значение, вторая – когда его нет (т.е. void).
    13. Функция возвращает указатель, который указывает на X-ю ячейку памяти. После выполнения функции, указатель А будет указывать на 5-й байт (в винде любые обращения по указателю с адресом меньше 0х10000 приведут к Access Violation, это просто для справки).
    15. Будет фактически вычислено F(X), т.к. инкремент постфиксный. Чтобы вычислить значение от увеличенного X, надо писать F(++X).

    На остальные вопросы либо лень отвечать, либо я не знаю ответа и лень думать =)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.