Мне интересно, что за доступ к классу friend
функции и static
Функции-члены имеют для объектов класса. В частности, в чем различия и зачем использовать одно над другим. Насколько я понимаю, функции объявлены как friend
класса или как static
члены оба имеют доступ к закрытым членам любого экземпляра этого класса.
Я приведу быстрый пример, чтобы показать, почему они кажутся мне такими похожими. Обе функции operator<
а также MyClass::lessThan
похоже, имеют те же права доступа и могут делать то же самое.
class MyClass {
friend bool operator<(const MyClass &left, const MyClass &right);
public:
MyClass(int pub, int priv) : m_pub(pub), m_priv(priv) {}
static bool lessThan(const MyClass &left, const MyClass &right);
int m_pub;
private:
int m_priv;
};
bool operator<(const MyClass &left, const MyClass &right) {
return ( (left.m_pub < right.m_pub) && (left.m_priv < right.m_priv) );
}
bool MyClass::lessThan(const MyClass &left, const MyClass &right) {
return ( (left.m_pub < right.m_pub) && (left.m_priv < right.m_priv) );
}
int main(int argc, const char* argv[]) {
MyClass a(1, 2),
b(3, 4),
c(-1, 1);
cout << "a < b = " << (a<b) << endl;
cout << "a lessThan b = " << MyClass::lessThan(a,b) << endl;
cout << "a < c = " << (a<c) << endl;
cout << "a lessThan c = " << MyClass::lessThan(a,c) << endl;
}
Ясно, что это упрощенный пример, но я предполагаю, что мой вопрос состоит из двух частей:
Помните, что хотя прототипы для друг функции появляются в определении класса, друг функции не являются функциональными членами. друг функция класса определяется вне класса, но друг Функция получила доступ к закрытым членам. Некоторые люди думают, что «дружба» портит сокрытие информации. Иногда друг функции используются для создания тестовых классов.
Статические члены данных используются, когда объектный класс должен совместно использовать только одну копию переменной. Таким образом, вы должны использовать статические члены данных для сохранения памяти, когда для всех членов класса достаточно одной копии.
Для статических функций-членов вы можете посмотреть следующее: Когда использовать статическую функцию-член?
Это разные понятия:
Если класс, метод или функция являются другом класса X, этот класс, функция или метод имеет доступ к члену класса X, который был объявлен закрытым и, таким образом, обычно недоступен за пределами класса.
class A{
private:
int x;
friend void foo(A& a);
};
void foo(A& a){
a.x = 3; //Access okay, foo is a friend of A
}
void bar(A& a){
a.x = -1; // Compiler will complain A::x is private
}
Статический член — это либо элемент данных, совместно используемый всеми экземплярами объекта этого класса, либо метод, который можно вызывать без объекта экземпляра этого класса.
class B{
private:
static int y;
public:
static void printY();
void alterY();
}
int B::y=3;
void B::printY(){
cout<<y;
}
void B::alterY(){
y++;
cout<<y;
}B b1,b2;
B::printY();// will output 3
b1.alterY();// will output 4
b2.alterY();// will output 5
Статические методы могут вызываться без прохождения экземпляра класса, поэтому они не имеют прямого доступа, они похожи на глобальные функции, но вложены в пространство имен класса. Однако, если вы дадите им экземпляр этого класса в качестве параметра, они смогут получить доступ к переменным-членам без прохождения через методы доступа, как в нестатических методах. Как и статические методы, функции-друзья, если вы дадите им экземпляр класса, с которым они дружат, в качестве параметра, они смогут напрямую обращаться к переменным-членам.
Каковы различия между дружественными и статическими функциями в отношении доступа члена?
Никто. Они оба имеют полное право доступа.
Какие вещи следует учитывать при принятии решения о том, какой использовать?
Это полностью зависит от контекста и того, что делает код легче для чтения.
В вашем примере выше я бы определенно предпочел bool operator<()
над MyClass::lessThan()
поскольку это делает код более интуитивно понятным для чтения.