#c #class
#c #класс
Вопрос:
Почему функции объектов обычно определяются как функции-члены класса, а не как дружественные функции (с передачей связанного экземпляра объекта в качестве параметра)?
Если вы реализуете push_back(vector v, val), front(vector v), back (vector) в качестве дружественных функций, которые принимают в качестве параметра вектор, например, это не сэкономит место, потому что функции не нужно будет определять каждый раз при создании векторного объекта, нотолько один раз?
Извините, если мой вопрос не имеет особого смысла. Я новичок в программировании, и мне не совсем нравится его жаргон / терминология. Если мне нужно переформулировать свой вопрос, потому что он неясен, пожалуйста, дайте мне знать.
Спасибо 🙂
Ответ №1:
Если они не являются виртуальными, функции-члены не занимают никакого места внутри класса. А виртуальные функции-члены занимают только постоянное пространство. Обычно это 8 байт, независимо от того, сколько виртуальных функций имеет класс. Это связано с тем, что классы с виртуальными функциями содержат указатель на vtable, который просматривает фактическую функцию во время выполнения.
При этом наличие дружественных функций в области пространства имен полезно, поскольку позволяет создавать наборы перегрузок. Набор перегрузок — это просто имя для всех перегрузок определенного имени функции. Например, std::to_string
установлена перегрузка, потому что существует несколько функций с таким именем.
Наборы перегрузок — действительно полезная концепция, потому что они позволяют вам писать универсальный код, который может работать с множеством разных типов, даже если эти типы, например, совершенно не связаны std::vector
и std::list
не наследуются друг от друга или от базового класса, но легко писать шаблонные функции, которые работают с любым из них.из них, потому что они имеют общий интерфейс с точки зрения того, как их можно использовать.
Ответ №2:
Если вы реализуете push_back(vector v, val), front(vector v), back (vector) в качестве дружественных функций, которые принимают в качестве параметра вектор, например, это не сэкономит место, потому что функции не нужно будет определять каждый раз при создании векторного объекта, нотолько один раз?
Функции не «определяются каждый раз, когда создается векторный объект». Вы не экономите место, используя функции-друзья как таковые.
Преимущества функций-членов в основном связаны с наследованием. Функции-члены могут иметь защищенный доступ, и они могут быть виртуальными и т.д.
Дружественные функции полезны при реализации симметричных двоичных (т.Е. С двумя аргументами, подсчет this
) функций. В качестве функции-члена первый аргумент будет особенным и не может обрабатываться одинаково. Кроме того, дружественные функции могут предоставлять API, совместимый с C, что полезно для межъязыкового программирования и общих библиотек.