2013-07-30 42 views
7

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

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

friend函数没有参数!

在不可能我看来

因为友元函数不是类的“成员” 所以我们不能用类对象

像拨打:

sample s; 
s.fun(); 
+4

@sehe:为什么?还有* conformist *朋友。 – Nawaz

+5

@Nawaz [在这里让我解释](http://i.imgur.com/axJmn.gif) –

+0

@ P0W你是什么意思*“它会有道理”*? –

回答

3

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

请举个例子吗? –

+0

@DixitSingla补充示例 –

+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 
} 
2

是的,但对于变量,你将需要它们是全球性的。在你的情况下,类型为sample的全局对象。或可能在内部创建函数的定义fun()

sample globalObject; 

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

除非函数内部创建了一个'sample'对象... – maditya

3

有可能没有参数的朋友功能。你需要另一种方法来访问类样本的对象。不要忘记,朋友功能还允许您访问类样本的私有静态变量,以防您需要时

1

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

4

当然,你可以......参见这里的样本code。但要定义内联函数,需要以sample作为参数,否则ADL将不起作用,编译器将无法解析func。见样品here

+0

感谢Asha对你的时间 请告诉我一件事,我们可以在类中定义好友函数吗? 如果没有,那为什么不呢? –

+0

@juanchopanza给我一个编译错误! –

+0

@ juanchopanza:在这种特殊情况下,它似乎是不可能的。编译器在没有任何参数时将无法找到“fun”。看到这里:http://codepad.org/6aaNmHK6 – Asha

1

这是可能,有一个朋友的乐趣没有参数的情况下。它很少使用。

+1

您能否请举例说明一下吗? –

+0

您可以将其用作辅助功能。一种情况可能是在对象状态改变时传达一些信息,你可以调用显示一些文本的朋友函数。 – Mahesh

+0

好吧知道了吧 谢谢 –

0
sample s; 
s.fun(); 

无论如何,这将无法正常工作,因为C++中的“友谊”只是提升对私人/受保护成员的访问限制。朋友不是班级成员,所以你无法调用s.fun()。

但是,您可以声明一个像你所描述的朋友功能,并从该功能,你将有权访问示例类的私人成员。

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; 
    } 
}; 
相关问题