這可能嗎?我們可以聲明一個沒有參數的朋友函數嗎?
class sample {
private:
int x;
public:
friend void fun();
};
friend
函數沒有參數!
在不可能我看來
因爲友元函數不是類的「成員」 所以我們不能用類對象
像撥打:
sample s;
s.fun();
這可能嗎?我們可以聲明一個沒有參數的朋友函數嗎?
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;
}
請舉個例子嗎? –
@DixitSingla補充示例 –
好的先生 謝謝 –
是的,您可以:
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
的全局對象。或可能在內部創建函數的定義fun()
。
sample globalObject;
void fun()
{
globalObject.x++; //this will work as fun() is friend function of sample.
}
除非函數內部創建了一個'sample'對象... – maditya
有可能沒有參數的朋友功能。你需要另一種方法來訪問類樣本的對象。不要忘記,朋友功能還允許您訪問類樣本的私有靜態變量,以防您需要時
當然這是可能的。你好奇你爲什麼會這樣做。例如,它可以訪問靜態私有成員變量。或者它可以訪問它通過某種方式獲得的對象的私有成員(單身,全局(對象的容器),...)
這是可能,有一個朋友的樂趣沒有參數的情況下。它很少使用。
sample s;
s.fun();
無論如何,這將無法正常工作,因爲C++中的「友誼」只是提升對私人/受保護成員的訪問限制。朋友不是班級成員,所以你無法調用s.fun()。
但是,您可以聲明一個像你所描述的朋友功能,並從該功能,你將有權訪問示例類的私人成員。
友方法可能是有用的,因爲對私有/受保護數據成員的訪問僅限於指定的方法。這個方法有參數或返回類型無關緊要。
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;
}
};
@sehe:爲什麼?還有* conformist *朋友。 – Nawaz
@Nawaz [在這裏讓我解釋](http://i.imgur.com/axJmn.gif) –
@ P0W你是什麼意思*「它會有道理」*? –