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