friend關(guān)鍵字用于聲明類的友元,友元可以無視類中成員的屬性淮韭,無論成員是public财搁、protected或是private,友元類或者友元函數(shù)都可以訪問慕购,這完全破壞了面向?qū)ο缶幊讨蟹庋b性的概念聊疲。C++11對friend關(guān)鍵字進行了一些改進,先看如下代碼
class Poly;
typedef Poly P;
class LiLei {
friend class Poly; //C++98通過沪悲, C++11通過
};
class Jim {
friend Poly; //C++98失敗获洲, C++11通過
};
class HanMeimei {
friend P; //C++98失敗, C++11通過
};
可以看出C++11中可训,聲明一個類為另外一個類的友元時昌妹,不再需要class關(guān)鍵字,甚至使用別名也是可以的握截。
這個改進的一個作用就是,可以為類模板聲明友元了烂叔,如下的代碼在C++98中是做不到的:
class P;
template <typename T> class People {
friend T;
};
People<P> PP; // 類型P在這里是People類型的友元了
People<int> Pi; // 對于int類型模板參數(shù)谨胞,友元聲明被忽略
下面是個例子,說明了類模板友元的用處蒜鸡,做單元測試的時候胯努,可以訪問private變量
template<typename T> class TargetT {
public:
friend T;
void run(int a, int b){
x = x + a;
y = y + b;
}
private:
int x = 0;
int y = 0;
};
#ifdef UNIT_TEST
class Validator {
public:
void validate(int a, int b, TargetT & t) {
}
};
int main(){
TargetT<Validator> target;
target.run(1, 2);
Validator v;
v.validate(1, 2, target);
return 0;
}
#endif