Announcements

Относно проведения изпит за ниво 3

Относно проведения изпит за ниво 3

by Трифон Трифонов -
Number of replies: 0

Здравейте, колеги,

 

Бих желал да внеса някои разяснения във връзка с възникналите въпроси относно изпита за ниво 3.

 

С колегите от преподавателския екип разбираме, че покрай изпитите се натрупва повече напрежение, особено във формата “изпит за ниво 3”, където човек трябва да се фокусира в рамките на кратко време, за да спечели правото да продължи нататък. Отдаваме разгорещените емоции именно на това напрежение, затова не намираме за нужно да отговаряме на породените от него лични коментари и квалификации.

 

За нас е по-важно да разсеем съмненията около двата въпроса породили дискусия.

 

Въпрос #1 (подчертаването е добавено допълнително):

 

Може ли обект от клас A да има член-данна, която е обект от същия клас A?

 

 

Верният отговор е Не (Лъжа, False). Обектите на даден клас не могат да притежават член-данна, която е обект от същия клас, понеже в такъв случай те би трябвало да заемат безкрайна памет. Разбира се, ако ставаше дума за член-данна, която е указател към обект или псевдоним на обект, тогава отговорът би бил Да.

 

Конкретното оплакване беше, че въпросът е сгрешен, тъй като е вярно, че един клас A може да има статична член-данна, която е обект от същия клас A. Мисля, че от подчертаването би трябвало ясно да личи, че това вече е друг въпрос. Един обект не може да притежава статични член-данни, това са член-данни, които принадлежат на класа. Наричат се още променливи на класа (class variable) или статични член-данни (static member variable). В допълнение към това, на моите лекции (КН 1 поток + СИ 4, 5 и 6 групи) нарочно съм отложил темата за статични член-данни за по-късно, с цел да се избегнат такива обърквания. Целта ми беше да разгледаме темата, когато студентите са по-добре запознати с материала. Затова ми е трудно да приема, че за един студент, посещавал редовно лекции, може да възникне каквото и да е объркване, особено след като беше изрично уточнено, че материалът ще е съобразен с лекциите. Освен това, както мисля че стана ясно, ако човек разбира какво представляват статичните член-данни, би трябвало бързо да съобрази, че те принадлежат на класа, а не на обекта.

 

Въпрос #2:

 

Кой е правилният начин за деклариране на конструктор за копиране за класа A?

 

Възможни отговори:

 

  • A(A a);

  • A(A const&);

  • A const& A();

  • A(A const* a);

  • A(A& a);

  • A* A();

  • A(A* const);

  • A& A(A const);

 

Както и сами сте стигнали до този извод във форума за въпроси, верният отговор е A(A const&). Както се вижда, този отговор присъства в списъка от възможни отговори на въпроса. Това, че местата на A и const могат да се разменят и че тази декларация е равнозначна на A(const A&) е нещо, което се изяснява още в първата част на курса по УП от миналия семестър.

 

Тук конкретното оплакване беше, че A(A& a) също е верен отговор и затова въпросът е сгрешен, тъй като допуска два верни отговора. Всички лектори и асистенти обръщат специално внимание на голямата четворка и специално на конструктора за копиране, понеже е особено важен за осмисляне на жизнения цикъл на обектите и в код на езика C++ тяхното познаване е ключово. В нито една от лекциите или от упражненията не е говорено за конструктор за копиране, който работи само над неконстантни обекти. Затова, отново, не виждаме как за един студент, който редовно посещава занятия, този въпрос би могъл да бъде заблуждаващ. Показателен е и фактът, че само 10% от явилите се на теста са посочили A(A& a) като верен отговор.

По-долу следва подробно обяснение, защо A(A& a) не е коректен отговор.

 

A(A& a) не е коректен отговор, защото този конструктор, въпреки че се допуска и при негова реализация би бил използвания за копиране от не-константен обект от класа А, то при подаване на константен обект (например при временен обект или обект имплицитно деклариран като константен) ще се използва конструкторът A(A const&), който винаги присъства като член на класа, или като изрично дефиниран, или като автоматично генериран. Изключение правят в случаите, A(A const&) когато експлицитно е забранен, като това е опция въведена в по-новия стандарт на езика (чрез конструкцията =delete). Що се отнася до коментара, че е възможно този конструктор — A(A& a)— да бъде автоматично дефиниран от компилатора, това отново е опция в по-новия стандарт, която трябва експлицитно да се зададе (чрез конструкцията =default). Така дефиниран конструктор, обаче, не забранява съществуването на типичния конструктор за копиране A(A const&). Именно затова A(A& a)не може да се счита за “правилният начин за деклариране на конструктор за копиране”, както е зададено във въпроса.

 

Мисля, че би трябвало да е пределно ясно, че не очакваме от студентите да познават тънкостите от разширенията на новия стандарт на езика за изпит от ниво 3. Особеностите на const са коментирани на лекции и упражнения, но въпросите, свързани с константите и тяхното коректно използване, ще се задават на тестовете за по-високите нива.

 

Сложността на курса и изпита са тема за друга дискусия. Единственото, което твърдим в момента е, че тестът за ниво 3 покрива един абсолютен минимум, който всеки претендиращ за висше образование в областта на информатиката трябва да може да покрие и то без да трябва да се подготвя предварително. В крайна сметка целта на изпита е да измери доколко добре сте усвоили материала. Ако не сте успели да се справите, имате възможност да се подготвите през лятото и да се явите отново през септември. В това няма нищо лошо, нито срамно, защото всеки учи с различно темпо, а и материалът не е лесен. Задачата на преподавателския екип през семестъра е да ви помогнем максимално да усвоите този материал, но в крайна сметка голямата част от усилието трябва да се свърши от вас.