Я писал код для учебного упражнения и столкнулся с простым вопросом. Было бы лучше, если бы я показал примеры в первую очередь.C++ Класс Состав: Конструктор? или()?
Первый класс: FCLASS heaader
class fClass { public: explicit fClass(int = 0, int = 0); fClass& operator()(int, int); void print(); private: int x; int y; }
Первый класс: FCLASS каст
fClass::fClass(int a, int b) : x(a), y(b) { } fClass& fClass::operator()(int a, int b) { x = a; y = b; } void fClass::print() { cout << "x: " << x << "\ny: " << y << endl; }
Второй класс, sClass.h
class sClass { public: explicit sClass(int = 0, int = 0); void print(); private: fClass firstClass; }
Второй класс, sClass.cpp
sClass::sClass(int a, int b) : firstClass(a, b) { } void sClass::print() { firstClass.print(); }
Основная функция
int main() { sClass secondClass(1, 2); secondClass.print(); }
Теперь мой вопрос, когда я удалил функции оператора() в FCLASS. Код все еще работал! Насколько я понимаю, «явное» объявление конструктора fClass должно запрещать определение fClass sClass в его конструкторе (firstClass (a, b)), поскольку fClass уже явно определен в объявлении частного члена. Поэтому, чтобы повторно инициализировать его в sClass как firstClass (a, b), должна быть определена операторная функция() (как и я). Почему этот код работает без определения operator()?
Чтобы добавить дополнительные комментарии к моему вопросу, к моему пониманию, выражение 'firstClass (a, b)' не должно вызывать явный конструктор fClass, потому что он не первый раз инициализируется. Опять же, к моему пониманию, конструкторы вызываются, когда класс сначала инициализируется для построения класса. firstClass уже инициализирован и сконструирован в файле заголовка ...
Только для вашей информации «класс» при определении экземпляров 'class sClass secondClass (1,2)' избыточен, аналогично для 'enum',' union', 'struct'. Тогда ни один из них не требует пяти файлов. При извлечении примера попробуйте поместить все в один файл и включить его, если это возможно. –