![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Источник: http://www.gamedev.ru/forum/?action=showto...up=9&topic=1321
--- кусь --- Damir Tenisheff Приложение к нитке "Где найти специалистов: Базовый уровень знаний С++". Непосредственно вопросы: Итак, вопросы. Полагаю, что писать ответы к ним в этой конференции не требуется. Сразу оговорюсь, что я не претендую на авторство вопросов. Что-то придумал сам по результатам чтения исходников в своей команде, что-то взял с других тестов и книг. Это не все вопросы – я выбрал 10 наиболее показательных. Если интересно – могу привести остальные. *** 1 *** Запишите названия типов и прокомментируйте, что в данном случае константно a) const char * b) char const * c) char * const Классические ошибки: - Второй вариант почти никто не знает. - Первый и третий вариант путают постоянно. Замечание: Почему-то про int * говорят “указатель на int”, а про char * говорят не “указатель на char”, а «указатель на строку». Я всё понимаю и это ошибкой не считаю, но это всё же неточность в простом задании. *** 2 *** Для типа T напишите объявление следующих методов a) конструктора копирования b) оператора присваивания c) оператора проверки на равенство d) оператора сложения Классические ошибки: - значения передают по значению, а не по ссылкам - ссылки делают не константными - проверка на равенство (если делается членом) не объявляется константным методом - оператор сложения пытается возвращать ссылку *** 3 *** Напишите максимально безопасный макрос, возводящий в квадрат свой аргумент. Прокомментируйте, какие могут неприятности при использовании данного макроса. Классические ошибки: #define sq(x) x*x Занавес. И вариации на эту тему. *** 4 *** struct A { A(){ cout << "A"; } }; struct B { B(){ cout << "B"; } }; struct C { C(){ cout << "C"; } }; struct D { D(){ cout << "D"; } }; struct E : D { E(){ cout << "E"; } }; struct F : A, B { C c; D d; E e; F() : B(), A(),d(),c(),e() { cout << "F"; } }; В каком порядке будут вызваны конструкторы классов при создании объекта типа F ? Запишите, каким будет при этом вывод программы? *** 5 *** Что произойдет в результате выполнения следующего кода? В чем ошибка? Как ее исправить? T *p = new T[10]; delete p; Классические ошибки: - Всё будет хорошо - Удалится только первый элемент - Удалится всё, но будет вызван деструктор только первого элемента *** 6 *** Что произойдет в результате выполнения следующего кода? T *p = 0; delete p; Классические ошибки: - Программа упадёт. Замечание: Я знаю, что для произвольного типа Т этот вопрос немного сложнее и надо спрашивать о том, не перегружен ли delete у типа Т. Но меня устроил бы простой ответ для POD-типов и пользовательских типов с неперегруженным delete. *** 7 *** Что означает запись: class Foo { void Bar( void ) const ; }; Что известно о методе Bar класса Foo? *** 8 *** Приведите пример виртуального наследования (запишите иерархию классов) и поясните, как производится инициализация виртуального базового класса. В чем состоят отличия от инициализации в отсутствии виртуального наследования? Классические ошибки: - Мне всё время рисуют ОБЫЧНОЕ наследование от ОДНОГО базового класса, имеющего виртуальные функции!!! - Если кто-то и знает о виртуальном наследовании (1 из 100) – ничего не знает об инициализации в этом случае. *** 9 *** В чем состоит потенциальная опасность данного кода: long value; … value &= 0xFFFF; Как он должен быть переписан, чтобы избежать проблем? Классические ошибки: - value &= (long) 0xFFFF; Занавес. *** 10 *** Что делается в следующем примере?
Зачем кому-нибудь может понадобиться подобный код? --- кусь --- Это сообщение отредактировал(а) Mayk - 21.8.2005, 19:58 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Последний пример я где-то уже встречал, интересно
|
|||
|
||||
| Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Как я горд, что знаю про виртуальное наследование
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Насколько я понимаю хитрость такой пары switch-while в том, что в первом цикле выполнится пересылка только count%8 значений, а во всех остальных циклах (коих либо count/8 при count%8=0 либо count/8 +1 при count%8 != 0) - по восемь значений. Для чего данная конструкция необходимо ответить трудно, я не сталкивался с необходимостью такой записи. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Мне кажется, что это просто побайтовое копирование (без какий-либо практической эффективности
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Mayk |
|
||||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Дыкть, это ж Разворачивание Цикла
Угу, memcpy/std::copy рулят
Мог бы и по ссылочке сходить. Ну да ладно.
Пересказываю ответ: если int не совпадает размером с long, то компилятор может перекастить 0xFFFF в 0xFFFFFFFF(если он считает int знаковым). (ИМХО плохая задача. ИМХО слишком надуманная - где это видано, чтобы sizeof(int) был равен 16 битам?! Да никогда. Мы не в 20ом веке. Сейчас в 16 бит даже символ может не влезть).
Кстати, а что сошло бы за безопасный макрос на третий вопрос? Ну кроме предполагаемого "я бы использовал inline ф-цию". Не могу придумать ничего безопаснее
Но это нельзя подставить в цикл for. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||||
|
|||||||||||||
| Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Интересное решение, но ИМХО бесполезное Без особых изврещение можно написать что-то вроде:
Хотя если x -- функция, то тоже не особо Насчёт 9-го. Ну я бы написал
вроде так... давно на Сях не писал А вот 10-е мне вооще не понятно. Цикл в switch? Надо дома попробовать -------------------- Да. Именно так. |
||||||
|
|||||||
| Chaos A.D. |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Я сначала по ссылке пошел, а потом твой пост начал читать. Там ответа на первой странице в вопросом не дали, следующие дальше читать не стал...
Я для флагов их и использовал. В конце концов, сегодняшние компилеры достаточно умны, чтобы также эффективно работать с битовыми полями, как и с масками. Кстати, а что есть "Разворачивание Цикла" aka "unrolling loop"? Это сообщение отредактировал(а) Chaos A.D. - 22.8.2005, 15:31 --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
||||
|
|||||
| Mayk |
|
||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
[offtop]и прально, нечего по другим форумам шататься(ответы там были где-то посредине)[/offtop]
Это когда цикл убирают для повышения быстродействия. То есть был
стал
Итог - увеличение скорости программы (не надо сравнивать i с 4 и инкриментировать i); В 10ом примере развернули примерно такой цикл
Довольно эффективное средство оптимизации, надо сказать. Это сообщение отредактировал(а) Mayk - 22.8.2005, 21:09 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||
|
|||||||||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Вот еще одна задачка на сообразительность(уж коли начали задачки сюда скидывать, продолжу сию славную традицию).
Есть код
Вы должны сделать так, чтобы в файл log.txt была выведена строка hello world(то есть fprintf в теле main должен быть выполнен). Вы НЕ можете добавлять новые переменные. Вы НЕ можете изменять тела существующих функций/методов. Вы НЕ можете использовать препроцессор(это не интересно). Других ограничений нет -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
Другими словами у тебя валится прога при вызове someStuff(); и ты не знаеш почему? --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Я знаю почему
Потому что здесь не дописан кусок кода. Вопрос - какой? Добавлено @ 17:50 Да, кстати. Прога вываливается после someStuff )) someStuff работает нормально. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Тут ИМХО не совсем корректно.
Я, например, могу вывести "hello world" и не из main, а то что он потом свалится меня не волнует Ведь добавлять новые методы не запрещено? -------------------- Да. Именно так. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Нет, надо вывести именно из main.
Запрещено изменять тела существующих ф-ций и добавлять переменные. Для большей ясности - файл log.txt НЕ должен быть закрыт Блин, не доглядел. Не надо было println делать - дырка ) Переопределять println в LogFile тоже нельзя. А то неинтересно. Это сообщение отредактировал(а) Mayk - 30.8.2005, 18:05 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну взять да деструктор добавить в LogFile
а там сделать LastCreatedFile=f; если бы он был виртуальным, но надо было бы добавить f=0;... -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |