forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Почувствуй себя ламьем (http://forum.boolean.name/showthread.php?t=15463)

.Squid 10.09.2011 04:45

Почувствуй себя ламьем
 
Мр.Ф прислал ссылку на тест
http://www.proprofs.com/quiz-school/...andidate-tests
У мну 2 из 6. При чем я даже не уверен, где именно точно правильно ответил. Печально.

Mind 10.09.2011 15:00

Ответ: Почувствуй себя ламьем
 
Хм.... странно я два раза нашару прошёл тест результат 2 of 6.

развод :-D походу

Upd. А нет! повезло (ну чтобы два раза хмм...).Эт не развод.

Nuprahtor 10.09.2011 15:01

Ответ: Почувствуй себя ламьем
 
6 из 6
Ошибок

Randomize 10.09.2011 17:35

Ответ: Почувствуй себя ламьем
 




SBJoker 10.09.2011 18:36

Ответ: Почувствуй себя ламьем
 
2 из 6.
Блин почему не пишут что неправильно было.

falcon 10.09.2011 19:16

Ответ: Почувствуй себя ламьем
 
http://www.quizful.net/test
советую вот этот ресурс.
после прохождения есть ответы и коментарии чо как и почему.
настоятельно советую помимо чтения книг и стандарта, почаще проходить такие вещи, мозги стимулирует (да и на практике некоторые задачки попадаются, но не часто конечно)

LLI.T.A.L.K.E.R. 11.09.2011 01:24

Ответ: Почувствуй себя ламьем
 
17 из 100
1 из 6

мудрёный этот с++
это как изучить китайский, чтобы программировать. А зачем это надо?

пытался понять по логике, но корючки языка не знаю.

.Squid 11.09.2011 01:36

Ответ: Почувствуй себя ламьем
 
Некорректное сравнение, имхо. Скорее, это как выучить иностранный язык на уровне филолога + носителя языка. Круто, но практический смысл теряется, т.к. можно успешно использовать язык и с гораздо меньшим словарным запасом. Возможно, речь будет не настолько изящна, но с другой стороны, и завернуть что-то заумное и непонятное не получится.

falcon 11.09.2011 01:47

Ответ: Почувствуй себя ламьем
 
.Squid
Цитата:

Круто, но практический смысл теряется
часто приходится спорить по поводу требуемых навыков, до какой степени действительно стоит погружаться в язык и т.п.
и на самом деле смысл не теряется. В реальной практике гуру языка действительно нужны, но их в команде много не надо, ибо они дорого стоят, а с основной массой задачь и правда справятся и менее прокаченые люди.

Samodelkin 11.09.2011 14:23

Ответ: Почувствуй себя ламьем
 
2 из 6. А там вообще больше можно набрать? =)

falcon 11.09.2011 17:43

Ответ: Почувствуй себя ламьем
 
http://www.proprofs.com/quiz-school/...uname=falco n
Samodelkin ды как бы можно..
я вот чо не понял, вопрос там такой:
Код:

class A
{
public:
    A(){ cout<<"1"<<endl; }
    ~A() { cout<<"2"<<endl; }
}

class B:public A
{
    B() { cout<<"3"<<endl; }
    ~B() { cout<<"4"<<endl; }
}

void foo( A a )
{
}

что происходит при вызове func? Вроде ж должен вызываться A( A& ) для аргумента, не?

Knightmare 11.09.2011 20:20

Ответ: Почувствуй себя ламьем
 
Вложений: 7
Под спойлером, по просьбам общественности, Кнайтэ дает ответы на все задачи с объяснением почему и как, а так же рассказывает, почему этот тест говно и его составил мудак не разбирающийся в стандарте С++.
Алсо для начала вброс:

Вложение 14793

Итак, скандалы, интриги, расследования:

1.
Вложение 14794
Верный ответ: a will have accidental value
Почему: члены объекта будут проинициализированны строго в порядке их объясления (и уничтожены в обратном). Поэтому нет разницы, что с вписке инициализаторов мы написали b перед а, а потом заюзали в инициализации а. Все равно а проинициализируется первым. Т.к. стандарт не говорит нам, чем должны инициализироваться скалярные типы, значение а будет равно какому-то мусору (значение b до инициализации) - 2. Точное значение зависит от платформы. В общем-то, в некоторых условиях можно словить и ошибку компиляции (есть там такой вариант), т.к. компилятор может кинуть ворнинг на неверный порядок инициализаторов, а ворнинги могут считаться и ошибками. Но это очень и очень маловероятно.

2.
Вложение 14795
(вариация где надо вбить ответ)
Верный ответ: 112.
Почему: при new Derived() сперва вызовется конструктор базового класса. В нем дернется виртуальный метод. Но. На этом этапе, объект еще не мутировал в Derived и является типа Base (пункт 10.4.6), поэтому вызовется реализация Base::method() (а если бы это была чисто виртуальная функция мы либо сразу отхватили Segmentation Fault, либо что хуже поломали бы стэк и получили фиерические баги в самых неожиданных местах). В метод будет передано 0, и он вернет 0 + 1 = 1, что и будет выведено. Далее произойдет мутация в Derived и будет выполнен его конструктор. Вызовется Derived::method() с аргументом 2, он вернет 2 - 1 = 1, что и будет выведенно. Далее это все ляжет в автопоинтер, это все херня и ни на что не влияет, исключая то, что как и полагается автопоинтеру, он уничтожит объект которым владеет при выходе из области видимости. Т.е. шаблон автопоинтера инстанциирован с типом Base, произойдет вызов деструктора Base::~Base(). Т.к. деструктор не виртуальный (а он обязан им быть) не произойдет вызова Derived::~Derived(), поэтому в результате будет выведено 2. После чего программа захлопнется. Итог - 112.

3.
Вложение 14796
(тут нас спрашивают в чем же проблема этого кода)
Правильный ответ: Base class should declare virtual desctructor
Почему: ну, это было выше, объект типа Derived будет уничтожен как Base, что может привести к утечкам памяти и неверному поведению. Поэтому надо сделать деструктор виртуальным. Вообще, его надо делать виртуальным и у отнаследованного класса, но это не важно. Алсо тут проблема вызова виртуальных методов из конструктора и деструктора., этим можно себе прострелить ногу.

4.
Вложение 14797
ПравильныйТипа правильный ответ: Compilation error because const_cast must be called as const_cast(i)
Почему: вообще этот вопрос придумал идиот. Во-первых, я подозреваю что там должно быть Compilation error because const_cast must be called as const_cast<int>(i). В таком случае у меня для него плохие новости, оно вернет rvalue, и, конечно же, в него невозможно присвоить значение. Еще вариант - Compilation error because const_cast must be called as *const_cast<int*>(&i). О да, мы сможем присвоитьзначение. Но тогда у меня еще более плохая новость для автора вопроса - пункт 7.1.5.1.4 стандарта, который говорит нам, что изменение константы это UB. Все. Никаких других вариантов, мы должны тут ответить вариантом об UB, но он неверный, очень приятно.

5.
Вложение 14798
ПравильныйТипа правильный ответ: 132242
Почему: сразу - автор неимевший дела с кросс-платформенным программирвоанием мудак и ответ действителен только для MSVC, другой компилятор скорее всего выдаст 13242. Теперь растолковывавние: При конструировании объекта типа B сперва вызовется конструктор А (выход 1), потом уже конструктор В (выхлоп 3). После этого что поизодйет в студии - она создаст проксирующий объект типа А из В (используя конструктор копирования A(const A & other), который не определен и, следовательно, ничего не выведет, т.к. будет использован сгенерированный компилятором, тупо копирующий все поля класса), а потом из него скопирует этим же конструктором копирования аргумент для func (и опять конструктор ничего не выведет). После этого функция отработает свое (тупо ничего не сделает) и аргумент будет убит. Вызоается деструктор А (выхлоп 2). После этого убъется проксирующий объект (опять 2). Вот это место никак не оговоренно стандартом и проксирующий объект инициатива студии (понятия не имею зачем, может есть какие-то реальные причины). Тот же GCC не будет создавать ничего лишнего и напрямую скопирует аргумент из b, поэтому и выведет только одну двойку. Далее все просто и по стандарту - вызовется деструктор B (выхлоп 4) и за них деструктор базового класса А (выхлоп 2). Поэтому и получает 132(2)42.

6.
Вложение 14799
Правильный ответ: Provide implementation of copy constructor and assignment operator
Почему: тут думаю все ответили правильно, ибо тривиальный вопрос. Хотя на самом деле хватит конструктора копирования, т.к. String b = a; это вызов конструктора копирования, а не вызов дефолтного конструктора и следом оператора присваивания. А нужно это все для того, чтобы у каждой строки был свой буфер символов (который уничтожится в деструкторе).

Собственно и все, ничего сложного и сверхъестественного в этих вопросах нет, даже нигде не присутствует черная шаблонная магия (а я могу на эту тему дать задачу, вот там действительно глубокое понимание стандарта С++).


Таким образом, человеки посчитавшие этот тест неибацо сложным могут облить себя бензином и поджечьидут курить стандарт С++

den 11.09.2011 20:23

Ответ: Почувствуй себя ламьем
 
Цитата:

а так же рассказывает, почему этот тест говно и его составил мудак не разбирающийся в стандарте С++.
кнайтэ вернулся:)

SBJoker 11.09.2011 20:33

Ответ: Почувствуй себя ламьем
 
Олсо этот тест выводит рандомные вопросы в рандомном порядке. Хотя думается их там мало.

falcon 11.09.2011 22:14

Ответ: Почувствуй себя ламьем
 
про прокси объект - новость, спс))
про константность вопрос действительно совсем косячный, да..
а ваще, подобного рода вопрсы самое то, для собеседования по плюсам, имхо)


Часовой пояс GMT +4, время: 13:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot