我们可以声明一个没有参数的朋友函数吗?

时间:2013-07-30 08:22:41

标签: c++ class friend-function

有可能吗?

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

friend函数没有参数!

在我看来不可能

因为朋友的功能不是"会员"课程 所以我们不能用类对象调用

像:

sample s;
s.fun();

9 个答案:

答案 0 :(得分:16)

是的,你可以:

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
}

答案 1 :(得分:4)

当然你可以..看这里的样本code。但是要定义函数内联,您需要将sample作为参数,否则ADL将无法工作,编译器将无法解析func。请参阅示例here

答案 2 :(得分:3)

可以没有参数的朋友函数。您需要另一种方法来访问类示例的对象。不要忘记,友元函数还允许您访问类示例的私有静态变量,以防您需要

答案 3 :(得分:3)

是的,你可以。这可能有很多原因,例如访问私有静态成员,或者可能存在sample的全局实例。 <{1}}也可能创建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;
}

答案 4 :(得分:2)

是的但是对于变量,你需要它们是全局的。您的案例中sample类型的全局对象。或者在函数内部创建对象可能在fun()的定义中。

sample globalObject;

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

答案 5 :(得分:1)

当然有可能。看来你想知道为什么会这样做。例如,它可以访问静态私有成员变量。或者它可以通过某种方式访问​​它获得的对象的私有成员(单例,全局(容器)对象,...)

答案 6 :(得分:1)

可能,拥有没有参数的朋友函数。它很少使用。

答案 7 :(得分:0)

sample s;
s.fun();

这无论如何都行不通,因为C ++中的“友谊”只是提升对私人/受保护成员的访问限制。朋友不是班级成员,因此您无法拨打s.fun()。

但是你可以声明你所描述的朋友函数,并且从该函数中你可以访问样本类的私有成员。

答案 8 :(得分:0)

友元方法可能很有用,因为对私有/受保护数据的访问仅限于指定的那些方法。此方法有参数或返回类型无关紧要。

template <class T>
class CLinkedListNode {
public:
    CLinkedListNode(CLinkedList<T>* Parent) : _Parent(Parent) {
    }
protected:
    CLinkedListNode * _Next;
    T _Data;
    CLinkedList<T>* _Parent;

    friend CLinkedListNode<T>* CLinkedList<T>::find(); // Only CLinkedList<T>::find() may access data members
    friend void sort(); // All sort methods may access data members
};

假设有一个类CLinkedList,其find()方法能够访问CLinkedListNode的所有数据成员。

template <class T>
class CLinkedList {
// ...
    CLinkedListNode<T>* find() {
        CLinkedListNode<T>* Node = new CLinkedListNode<T>(this);
        CLinkedListNode<T>* Find = Node->_Next;
        while (Find->_Next) {
            // Do something
            Find = Find->_Next;
        }
        // ...
        return Node;
    }
};