Я пытаюсь понять некоторый код C ++ и нахожу, что мой C ++ немного радужен. Среди прочего код имеет следующую структуру классов (CLASS1
в CLASS3
не показано для краткости):
class CLASS4
:public CLASS3
,public CLASS2{
public:
CLASS4(double VARA, double VARB, char VARC, int VARD, double VARE, std::vector<double> VARF, std::string VARG = "")
throw(Error);
CLASS4(const CLASS4&);
~CLASS4();
double METHOD1();
protected:
void METHOD2();
};
CLASS4::CLASS4(double VARA, double VARB, char VARC, int VARD, double VARE, vector<double> VARF, string VARG) throw(Error)
:CLASS1(VARC, VARD, VARE, VARF, VARG)
,CLASS2(VARB)
,CLASS3(VARA, VARC, VARD, VARE, VARF, VARG){}
CLASS4::CLASS4(const CLASS4& VARH)
:CLASS1(VARH), CLASS2(VARH), CLASS3(VARH){}
CLASS4::~CLASS4(){}
Я понимаю концепцию объекта и концепцию наследования. Я вижу конструктор и деструктор CLASS4
, То, что я не понимаю, это список классов в наследство :public CLASS3, public CLASS2
, Какова цель этого? Кроме того, мне интересно, что throw(Error)
должен делать. Также мне интересно, какова цель второго конструктора CLASS4(const CLASS4&);
является. Я знаю, что это будет простой проблемой для программиста C ++.
class CLASS4
:public CLASS3
,public CLASS2
это множественное наследование. Цель множественное наследование делает функциональные возможности вашего объекта имеет также функциональные возможности class2 а также class3 который создан из Class4 (прочитайте эту страницу для подробного объяснения: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr134.htm )
бросок (ошибка) Предполагается, что выдает ошибку, когда обнаруживает ошибку, может показаться неубедительной, но она используется для обработки исключений 🙂 (Я предлагаю вам прочитать эту страницу для ясной ссылки: http://msdn.microsoft.com/en-us/library/6dekhbbc(v=vs.80).aspx)
а также CLASS4(const CLASS4&);
это конструктор копирования. «Конструктор копирования — это специальный конструктор в языке программирования C ++ для создания нового объекта как копии существующего объекта». (цитата из википедии. http://en.wikipedia.org/wiki/Copy_constructor)
Включение нескольких классов в список базовых спецификаторов позволяет классу наследовать от нескольких других классов. Это обычно известно как множественное наследование.
размещение throw(error)
после объявления функции это способ выражения функции, какие исключения она может генерировать. Это известно как спецификация исключения. В этом случае CLASS4
конструктор со многими аргументами заявляет, что он может бросить error
исключение. Эти спецификации исключений теперь устарели в C ++ 11.
Конструкторы формы T(const T&)
известны как копировать конструкторы. Они вызываются в ситуациях, подобных следующей, когда объект создается путем копирования другого объекта:
T first;
T second(first);
Ваш CLASS4
класс имеет конструктор копирования. Ожидается, что после того, как конструктор копирования будет использован для создания объекта, новый объект будет копией старого объекта.
class CLASS4: public CLASS3, public CLASS2
говорит, что CLASS4 наследует открытые методы и свойства CLASS3 а также CLASS2, и обрабатывает их почти так же, как и свои публичные методы (то есть они являются публичными методами CLASS4). Если бы вы использовали private CLASS3, protected CLASS2
, вы бы взяли общедоступные методы CLASS3 и сделали бы их закрытыми в CLASS4. Аналогично, публичные методы CLASS2 станут защищенными в этом примере. Это может быть полезно в определенных ситуациях: скажем, у вас есть класс, который можно сериализовать на диск и выводить на экран осмысленным образом. Вы бы унаследовали «Serialisable» и «Renderable», чтобы получить свойства обоих.
CLASS4(const CLASS4& VARH)
Конструктор известен как «Копировать конструктор». Учитывая пример CLASS4, сделайте мне новый CLASS4, который имеет все те же значения в своих свойствах. По умолчанию C ++ предоставляет вам простой способ, который просто копирует каждое свойство по очереди, поэтому вам обычно не нужно указывать. Если вы делаете что-то умное (например, вы назначаете большой блок памяти и хотите также скопировать содержимое этой памяти, а не только указатель на нее), вам нужно вручную указать свой собственный, который выполняет умные действия.