友元函式
阿新 • • 發佈:2021-02-14
技術標籤:C++
為什麼要使用友元函式
當類想要實現一個功能,而他本身又完成不了的時候,需要藉助外力來完成,這時候設定一個友元函式來完成.友元函式可以訪問類裡的所有資料,提高了執行效率
友元函式的倆種使用方式
友元函式,友元類
使用全域性函式作為友元函式
這裡設計了一個CPU升級的函式,因為電腦本身是無法自己給自己升級的,所以就要藉助外力,當然也可以定義介面寫
這裡的實現友元函式也很簡單,只要把宣告放入類裡就行,public和private都一樣
#include <iostream>
#include <string>
#include <sstream>
//把全域性函式設為友元函式
//設一個升級CPU的函式
class computer
{
public:
computer();
std::string description();
friend void upgrade(computer* computer);
private:
std::string CPU;
};
computer::computer()
{
this->CPU = "i7";
}
std::string computer:: description() {
std::stringstream ret;
ret << "CPU:" << CPU;
return ret.str();
}
void upgrade(computer *computer) {
computer->CPU = "i9";
}
int main() {
computer com;
std::cout << com.description() << std::endl;
upgrade(&com);
std::cout<<com.description()<<std::endl;
system ("pause");
return 0;
}
使用類的成員函式作為友元函式
這裡再寫函式時遇到幾個問題,因為為了方便複製過來,我沒有把類和方法以及main函式分開寫,不知道問題是不是出現在這
1.先定義的類的成員函式才可以在後定義的類裡 作為成員函式
2.因為上面那點,所以先定義的類的成員函式可能會引用下面的類,所以要在前面先申明,比如我寫的 class computer,
如果涉及到具體方法還要新增標頭檔案
#include <iostream>
#include <string>
#include <sstream>
//把類的成員函式設為友元函式
//設一個升級CPU的函式
class computer;
class computerServe
{
public:
void upgrade(computer* computer);
private:
std::string CPU;
};
class computer
{
public:
computer();
std::string description();
friend void computerServe::upgrade(computer* computer);
private:
std::string CPU;
};
computer::computer()
{
this->CPU = "i7";
}
std::string computer:: description() {
std::stringstream ret;
ret << "CPU:" << CPU;
return ret.str();
}
void computerServe::upgrade(computer *computer) {
computer->CPU = "i9";
}
int main() {
computer com;
computerServe serve;
std::cout << com.description() << std::endl;
serve.upgrade(&com);
std::cout<<com.description()<<std::endl;
system("pause");
return 0;
}