Является ли это возможным?
class sample {
private:
int x;
public:
friend void fun();
};
friend
функция без аргументов!
На мой взгляд не возможно
Потому что функции друзей не являются «членами» классов
Поэтому мы не можем звонить с объектом класса
лайк:
sample s;
s.fun();
Да, ты можешь. Для этого может быть много причин, таких как доступ к закрытым статическим членам или глобальный экземпляр 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;
}
Да, ты можешь:
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
}
Конечно, вы можете .. см. Здесь для образца код. Но чтобы определить встроенную функцию, нужно взять sample
в качестве параметра, иначе ADL не будет работать и компилятор не сможет разрешить func
, См образец Вот.
Возможно иметь дружественные функции без аргументов. Вам нужен еще один способ получить доступ к объекту класса sample. Не забывайте, что функции друзей также позволяют вам получить доступ к закрытым статическим переменным класса sample, если вам это нужно
Да, но тогда для переменных вам нужно, чтобы они были глобальными. Глобальный объект типа sample
в твоем случае. Или же создать объект внутри функции внутри в определении fun()
наверное.
sample globalObject;
void fun()
{
globalObject.x++; //this will work as fun() is friend function of sample.
}
это возможный, иметь функцию друга без аргументов. Это редко используется.
Конечно, это возможно. Кажется, вы удивляетесь, почему так поступили. Например, он может получить доступ к статической закрытой переменной-члену. Или он может получить доступ к закрытым членам объектов, которые он получает каким-либо образом (singleton, global (container of) object (s), …)
sample s;
s.fun();
Это не сработает в любом случае, потому что «дружба» в C ++ просто снимает ограничения доступа для частных / защищенных членов. Друг не является членом класса, поэтому вы не можете вызвать s.fun ().
Однако ты Можно объявите функцию друга, как вы описали, и из этой функции у вас будет доступ к закрытым членам примера класса.