Какой доступ к элементам имеют функции-друзья и статические функции-члены?

Мне интересно, что за доступ к классу 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;
}

Ясно, что это упрощенный пример, но я предполагаю, что мой вопрос состоит из двух частей:

  1. Каковы различия между дружественными и статическими функциями в отношении доступа члена?
  2. Какие вещи следует учитывать при принятии решения о том, какой использовать?

2

Решение

Помните, что хотя прототипы для друг функции появляются в определении класса, друг функции не являются функциональными членами. друг функция класса определяется вне класса, но друг Функция получила доступ к закрытым членам. Некоторые люди думают, что «дружба» портит сокрытие информации. Иногда друг функции используются для создания тестовых классов.

Статические члены данных используются, когда объектный класс должен совместно использовать только одну копию переменной. Таким образом, вы должны использовать статические члены данных для сохранения памяти, когда для всех членов класса достаточно одной копии.

Для статических функций-членов вы можете посмотреть следующее: Когда использовать статическую функцию-член?

2

Другие решения

  1. Они оба имеют доступ ко всем членам класса, включая частных
  2. Вам необходимо решить, относится ли функция логически к классу, доступ к которому ему нужен, или к другому классу или вообще не принадлежит. В первом случае (функция, которая логически принадлежит классу) делает функцию статической; во втором случае сделайте его другом и добавьте его к классу или пространству имен, к которому он логически принадлежит, в соответствии с вашим дизайном.
1

Это разные понятия:

Если класс, метод или функция являются другом класса 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
1

Статические методы могут вызываться без прохождения экземпляра класса, поэтому они не имеют прямого доступа, они похожи на глобальные функции, но вложены в пространство имен класса. Однако, если вы дадите им экземпляр этого класса в качестве параметра, они смогут получить доступ к переменным-членам без прохождения через методы доступа, как в нестатических методах. Как и статические методы, функции-друзья, если вы дадите им экземпляр класса, с которым они дружат, в качестве параметра, они смогут напрямую обращаться к переменным-членам.

1

Каковы различия между дружественными и статическими функциями в отношении доступа члена?

Никто. Они оба имеют полное право доступа.

Какие вещи следует учитывать при принятии решения о том, какой использовать?

Это полностью зависит от контекста и того, что делает код легче для чтения.

В вашем примере выше я бы определенно предпочел bool operator<() над MyClass::lessThan() поскольку это делает код более интуитивно понятным для чтения.

0
По вопросам рекламы [email protected]