Другие языки программирования и технологии
Ребят, вопрос по ООП в С++
у меня в программе метод (или функция, я не знаю) описана не в классе, где всякие паблик приват, а отдельно. на примере: в public написано bool push(const T); а отдельно у меня bool Stack::push(const T value). ну и так далее. Все работает. Вопрос такой: что будет, если описать все это не отдельно от класса, а прям внутри? Проверил-так работает, внешне изменений нет. Но препод говорит что-то меняется
Объявление и определение шаблонных функций и функций-членов шаблонного класса размещается в заголовочном файле. Это связано с тем, что когда компилятор встречает определение шаблона, он не создаёт код. Они и понятно – реальный тип ему пока не известен. Он станет известен только при создании специфического экземпляра шаблона. Для создания экземпляра у компилятора должен быть код, определяющий функцию-член шаблона класса. По этой причине заголовки шаблонов включают определения наравне с объявлениями и поэтому они расположены в заголовочных файлах.
Если определение функции-члена не выносить за пределы класса, то такая функция-член будет inline (т. е. встроенной), а это значит, что её код будет каждый раз подставляться компилятором в месте вызова. Если внутренняя реализация занимает большой размер, а вызовы будут выполняться в цикле, то размер исполняемого файла может быть большим или просто огромным. К встроенным методам нужно относится с большой осторожностью.
Если определение функции-члена не выносить за пределы класса, то такая функция-член будет inline (т. е. встроенной), а это значит, что её код будет каждый раз подставляться компилятором в месте вызова. Если внутренняя реализация занимает большой размер, а вызовы будут выполняться в цикле, то размер исполняемого файла может быть большим или просто огромным. К встроенным методам нужно относится с большой осторожностью.
Где конкретно она прописана, если не в классе? По дефолту в C++ вроде бы private.
Что значит отдельно? В другом файле?
Разделение нужно для того, чтобы компилировать по частям, и перекомпилировать только изменённые файлы.
Надо пихнуть в файл *.h только названия методов чтобы компилятор знал, что такие методы есть.
В файле *.cpp пишется уже реализация.
Компилятор обрабатывает каждый файл *.cpp отдельно, "забывая" про остальные, и создаёт объектный файл.
Потом компоновщик (линкер) собирает объектные файлы в один исполняемый файл.
Чтобы "напомнить" компилятору о других файлах *.cpp, используются файлы *.h. Препроцессор, встретив в файле "my_file.cpp" строку
#include "my_file.h"
вставляет весь текст файла "my_file.h" в файл "my_file.cpp" вместо этой строки.
Если в файле "my_file.h" будет реализация чего-то (кроме реализации метода прямо в классе, странно), и этот файл включить в несколько файлов *.cpp, то в каждом объектном файле будет "своя" реализация, и компоновщик откажется их собирать.
Кстати, "объявление" глобальной переменной
int screen_width = 640;
это тоже как реализация. Объявлять переменную, не реализуя её, надо так:
extern int screen_width;// нельзя здесь задавать значение
В каком-то одном файле *.cpp надо всё же переменную реализовать.
Разделение нужно для того, чтобы компилировать по частям, и перекомпилировать только изменённые файлы.
Надо пихнуть в файл *.h только названия методов чтобы компилятор знал, что такие методы есть.
В файле *.cpp пишется уже реализация.
Компилятор обрабатывает каждый файл *.cpp отдельно, "забывая" про остальные, и создаёт объектный файл.
Потом компоновщик (линкер) собирает объектные файлы в один исполняемый файл.
Чтобы "напомнить" компилятору о других файлах *.cpp, используются файлы *.h. Препроцессор, встретив в файле "my_file.cpp" строку
#include "my_file.h"
вставляет весь текст файла "my_file.h" в файл "my_file.cpp" вместо этой строки.
Если в файле "my_file.h" будет реализация чего-то (кроме реализации метода прямо в классе, странно), и этот файл включить в несколько файлов *.cpp, то в каждом объектном файле будет "своя" реализация, и компоновщик откажется их собирать.
Кстати, "объявление" глобальной переменной
int screen_width = 640;
это тоже как реализация. Объявлять переменную, не реализуя её, надо так:
extern int screen_width;// нельзя здесь задавать значение
В каком-то одном файле *.cpp надо всё же переменную реализовать.
Похожие вопросы
- Вопрос программистам. ООП
- С++ пару вопросов о ООП
- Вопрос по ООП. Инкапсуляция, наследие, полиморфизм. Как понять все это чудо?
- Вопрос по ооп. С#
- ребята! вопрос внутри! помогите и 10 балов дам!
- Ребята!!Вопрос по сути...кто юзает Adobe Audition 3.0!!?есть проблемма....при воспроизведении звуки "Ш","С","Ц,"....
- Ребят, вопрос про криптовалюту
- Изучнние ООП - стоит ли сейчас?
- ООП. Стоит ли браться за ООП новичку в программировании?:
- ООП - зло. Ваше мнение.
все работает, и так, и эдак.
вопрос, что изменится?)