2013-07-30 240 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; 
    } 
}; 
相關問題