Вопросы для второго уровня.
Какая здесь ошибка?
class CBaseClass{ CBaseClass( void ){} public: static CBaseClass *Construct( void ) { return( new CBaseClass() ); } }; class CDerivedClass:public CBaseClass{ public: CDerivedClass( void ){} }; int main( int argc , char *argv[] ) { CDerivedClass ob; return( 0 ); }
Конструктор по-умолчанию в базовом классе объявлен закрытым. Поэтому когда мы попытаемся создать объект производного класса, то получим ошибку компиляции – компилятор укажет, что для создания объекта ob нужен вызов конструктора базового класса, но он объявлен закрытым, потому объекты производного класса создать нельзя.
Какая здесь ошибка?
class A{ protected: int x; }; class B: public A{}; class C: public A{}; class D: public B , C{ public: D( void ) { x = 0; } }; int main( int argc , char *argv[] ) { return( 0 ); }
Ошибка возникнет во время присваивания x=0. Т.к. компилятор не будет знать какому инстансу этой переменной присваивать нулевое значение, B::A::x? Или C::A::x?
Зачем в STL нужны итераторы?
Для того чтобы был унифицированный доступ к элементам последовательности. Собственно если стандарт открыть, то там оперируют именно термином «последовательность», без указания деталей реализации этой последовательности. Это может быть вектор, стэк или очередь. Итераторы позволяют от этого всего абстрагироваться.
Чем отличается выделение памяти с помощью new и malloc?
При выделении памяти с помощью new для объекта, будет вызван конструктор этого объекта. + new является оператором и его можно перегружать для каждого класса.
Что делает следующая программа
#include < algorithm > #include < iostream > #include < vector > int main( int argc , char *argv[] ) { std::vector< int > v; v.push_back( 1 ); v.push_back( 2 ); v.push_back( 3 ); v.push_back( 2 ); v.push_back( 3 ); v.erase( std::remove( v.begin() , v.end() , 2 ) , v.end() ); return( 0 ); }
Происходит удаление все элементов равных «2». Не очень быстро, зато элегантно.
Какими свойствами должен обладать объект, чтобы его можно было хранить в STL контейнере?
Должен обладать корректными конструктором копирования и оператором присваивания.