Можем ли мы объявить функцию друга без аргумента?

Является ли это возможным?

class sample {
private:
int x;
public:
friend void fun();
};

friend функция без аргументов!

На мой взгляд не возможно

Потому что функции друзей не являются «членами» классов
Поэтому мы не можем звонить с объектом класса

лайк:

sample s;
s.fun();

7

Решение

Да, ты можешь. Для этого может быть много причин, таких как доступ к закрытым статическим членам или глобальный экземпляр sample, Также возможно, что fun создает экземпляр sample и захватить его рядовые.

рабочий пример для создания функции и работы с ней:

#include <iostream>
class sample {
private:
int x;
public:
friend void fun();
};

void fun()
{
sample s;
s.x = 555555555;
std::cout << s.x;
}
int main(){
fun();
return 0;
}

пример с глобальным экземпляром:

#include <iostream>
#include <string>
class sample {
private:
int x;
public:
friend void fun();
};
sample s;

void fun()
{

s.x = 555555555;
std::cout << s.x;
}
int main(){
fun();
return 0;
}

пример с закрытым статическим членом:

#include <iostream>
#include <string>
class sample {
private:
int x;
static const int w = 55;
public:
friend void fun();
};void fun()
{

std::cout << sample::w;
}
int main(){
fun();
return 0;
}
3

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

Да, ты можешь:

void fun()
{
sample s;
s.x++;   // OK, fun() is a friend of sample
}

или же

sample globalSample; // yikes, a global variable

void fun()
{
int i = globalSample.x; // OK, fun() is a friend of sample
}
16

Конечно, вы можете .. см. Здесь для образца код. Но чтобы определить встроенную функцию, нужно взять sample в качестве параметра, иначе ADL не будет работать и компилятор не сможет разрешить func, См образец Вот.

4

Возможно иметь дружественные функции без аргументов. Вам нужен еще один способ получить доступ к объекту класса sample. Не забывайте, что функции друзей также позволяют вам получить доступ к закрытым статическим переменным класса sample, если вам это нужно

3

Да, но тогда для переменных вам нужно, чтобы они были глобальными. Глобальный объект типа sample в твоем случае. Или же создать объект внутри функции внутри в определении fun() наверное.

sample globalObject;

void fun()
{
globalObject.x++;   //this will work as fun() is friend function of sample.
}
2

это возможный, иметь функцию друга без аргументов. Это редко используется.

1

Конечно, это возможно. Кажется, вы удивляетесь, почему так поступили. Например, он может получить доступ к статической закрытой переменной-члену. Или он может получить доступ к закрытым членам объектов, которые он получает каким-либо образом (singleton, global (container of) object (s), …)

1
sample s;
s.fun();

Это не сработает в любом случае, потому что «дружба» в C ++ просто снимает ограничения доступа для частных / защищенных членов. Друг не является членом класса, поэтому вы не можете вызвать s.fun ().

Однако ты Можно объявите функцию друга, как вы описали, и из этой функции у вас будет доступ к закрытым членам примера класса.

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