友元函數(shù)的聲明和定義 友元函數(shù)應當在類的private中還是public中聲明?
友元函數(shù)應當在類的private中還是public中聲明?首先,友元是一種定義在類外部的普通函數(shù)或類,但它需要在類體內進行說明,為了與該類的成員函數(shù)加以區(qū)別,在說明時前面加以關鍵字friend。友元不
友元函數(shù)應當在類的private中還是public中聲明?
首先,友元是一種定義在類外部的普通函數(shù)或類,但它需要在類體內進行說明,為了與該類的成員函數(shù)加以區(qū)別,在說明時前面加以關鍵字friend。
友元不是成員函數(shù),但是它可以訪問類中的私有成員。所以,友元聲明只能出現(xiàn)在類定義中。因為友元不是授權類的成員,所以它不受其所在類的聲明區(qū)域public private 和protected 的影響。構造函數(shù)聲明成友元時,不能同時定義嗎?
friend double REALSET::REALSET(INTSET &s)//自動成為inline函數(shù)
{
...
}
這段代碼不對,有兩個問題。首先,你不能在INTSET類中定義REALSET的成員函數(shù),注意是不能定義,不是不能聲明; 其次構造函數(shù)不能有返回值,把那個double去掉。
更改成這樣:
class INTSET{
...
friend REALSET::REALSET(INTSET &s) //只保留聲明
...
}//end of class INTSET
//REALSET構造函數(shù)移植INTSET之后。
//注意在此函數(shù)中使用了INTSET類的成員,所以必須定義在INTSET類之后。
REALSET::REALSET(INTSET &s)
{
...
}
友元函數(shù)為什么不直接定義為類的成員函數(shù)呢,他倆感覺沒什么區(qū)別呀?
那就不要用友元函數(shù)。本來就有人認為完全不該用友元函數(shù)
使用運算符重載,有的時候不適合直接聲明為成員函數(shù)。
class point {
private:
int x
int y
public:
point(int x,int y)
}
std::ostream& operator<<(std::ostream& os, const point& p)
//重載流輸出運算符,運算符的左操作數(shù)必須是 std::ostream& 類型,不能直接聲明為成員函數(shù)
//流輸出函數(shù)必須訪問point類的數(shù)據(jù)成員(包括private數(shù)據(jù)成員)
//典型實現(xiàn)是 return os << p.x << " " << p.y
不過這也有別的解決方法,不是把 operator<< 聲明為友元函數(shù),而是使用一個成員函數(shù)(類似于訪問者模式)
class point {
private:
int x
int y
public:
point(int x,int y)
std::ostream& print_by(std::ostream& os)//成員函數(shù)print_by定義實際的輸出方式
}
//重載流輸出運算符,運算符的左操作數(shù)必須是 std::ostream& 類型,不能直接聲明為成員函數(shù)
//不需要作為友元函數(shù)
std::ostream& operator<<(std::ostream& os, const point& p){
return p.print_by(os) //調用成員函數(shù) print_by
}
C 如何將一個類的成員函數(shù)申明為另一個類的友元函數(shù)?
可以在類A中把類B的一個成員函數(shù)聲明為自己的友元函數(shù)。 class A { void F() } #include "A.h" class B { friend void A::F() }
友元函數(shù)是否能訪問當前類中對象成員的私有成員?
1、友元函數(shù)是可以直接訪問類的私有成員的非成員函數(shù)。它是定義在類外的普通函數(shù),它不屬于任何類,但需要在類的定義中加以聲明,聲明時只需在友元的名稱前加上關鍵字friend。
2、友元函數(shù)可以訪問類的靜態(tài)成員、私有成員和公有成員。
3、友元的作用在于提高程序的運行效率(即減少了類型檢查和安全性檢查等都需要的時間開銷),但是,它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員。