溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中成員函數(shù)和友元函數(shù)有哪些區(qū)別

發(fā)布時間:2022-01-27 09:10:20 來源:億速云 閱讀:155 作者:小新 欄目:開發(fā)技術

小編給大家分享一下C++中成員函數(shù)和友元函數(shù)有哪些區(qū)別,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為什么使用成員函數(shù)和友元函數(shù)

這個問題至關重要,直接影響著后面的理解:

程序數(shù)據(jù): 數(shù)據(jù)是程序的信息,會受到程序函數(shù)的影響。封裝是面向對象編程中的把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)綁定在一起的一個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。

數(shù)據(jù)封裝引申出了另一個重要的 OOP 概念,即 數(shù)據(jù)隱藏 。數(shù)據(jù)封裝 是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機制, 數(shù)據(jù)抽象 是一種僅向用戶暴露接口而把具體的實現(xiàn)細節(jié)隱藏起來的機制。C++ 通過創(chuàng)建類來支持封裝和數(shù)據(jù)隱藏(public、protected、private)。我們已經(jīng)知道,類包含私有成員(private)、保護成員(protected)和公有成員(public)成員。默認情況下,在類中定義的所有項目都是私有的。
由于C++的封裝和隱藏特性,只有類定義的成員函數(shù)可以訪問類定義的私有數(shù)據(jù)。

成員函數(shù)是數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制。

友元是C++提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制。

成員函數(shù)的使用

首先先看代碼

class Stock{ //class declaration
private:
    std:: string company;
    long shares;
    double share_val;
    double total_val;
void set_tot(){ total_val=shares* share_val;}
public:
void acquire(const std:: string & co, long n, double pr);
void buy(long num, double price);
void se11(long num, double price);
void update(double price);
void show();
};//note semicolon at the end

注意這里面的private可以不寫,如果不寫的話默認是私有的。
其中,company、shares等都是Stock類的私有數(shù)據(jù)成員。如果試圖使用非成員函數(shù)訪問這些數(shù)據(jù)成員編譯器禁止這樣做。如果試圖破解該機制,友元是另一種選擇。

實現(xiàn)類成員函數(shù)
(1)定義成員函數(shù)時,使用作用域解析運算符(::)來標識函數(shù)所屬的類;

void Stock::update(double price)

(2)類方法可以訪問類的private組件。

友元

C++是從結構化的C語言發(fā)展而來的,需要照顧結構化設計程序員的習慣,所以在對私有成員可訪問范圍的問題上不可限制太死。
C++設計者認為,如果有的程序員真的非常怕麻煩,就是想在類的成員函數(shù)外部直接訪問對象的私有成員,那還是做一點妥協(xié)以滿足他們的愿望為好,這也算是眼前利益和長遠利益的折中。因此,C++就有了友元(friend)的概念。打個比方,這相當于是說:朋友是值得信任的,所以可以對他們公開一些自己的隱私。
友元提供了一種普通函數(shù)或者類成員函數(shù)訪問另一個類中的私有或保護成員的機制。也就是說有兩種形式的友元:
(1)友元函數(shù):普通函數(shù)對一個訪問某個類中的私有或保護成員。
(2)友元類:類A中的成員函數(shù)訪問類B中的私有或保護成員。
(3)友元成員函數(shù)

友元函數(shù)
創(chuàng)建友元函數(shù)的第一步是將其原型放在類聲明中,并在原型聲明前加上關鍵字friend:

friend Time operator*(double m,constTime&t);

注意該聲明可以在類外也可以在類中
這樣即使operator不是成員函數(shù) ,但它與成員函數(shù)的訪問權限相同,可以訪問類中的私有變量。

友元類
類Y的所有成員函數(shù)都為類X友元函數(shù)

class girl;
class girl{
private:
  char *name;
  int age;
  friend boy; //聲明類boy是類girl的友元
};
class boy{
public:
  void disp(girl &);
};
void boy::disp(girl &x) //函數(shù)disp()為類boy的成員函數(shù),也是類girl的友元函數(shù)
{
    //借助友元,在boy的成員函數(shù)disp中,借助girl的對象,直接訪問girl的私有變量
   cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
}

成員函數(shù)作友元
類Y的一個成員函數(shù)為類X的友元函數(shù)
目的:使類Y的一個成員函數(shù)成為類X的友元,具體而言:在類Y的這個成員函數(shù)中,借助參數(shù)X,可以直接使用X的私有變量
語法:聲明在公有中 (本身為函數(shù))
聲明:friend + 成員函數(shù)的聲明
調用:先定義Y的對象y&mdash;使用y調用自己的成員函數(shù)&mdash;自己的成員函數(shù)中使用了友元機制

class Stock{ //class declaration
private:
    std:: string company;
    long shares;
    double share_val;
    double total_val;
void set_tot(){ total_val=shares* share_val;}
public:
void acquire(const std:: string & co, long n, double pr);
void buy(long num, double price);
void se11(long num, double price);
void update(double price);
void show();
};
class Market{
    friend void Stock::acquire(const std:: string & co, long n, double pr);
    //Stock類下的acquire可以作為該成員函數(shù)的友元函數(shù),可以訪問該類的私有變量
    int price;
    int fiture;
public:
    void stuff();
};

如代碼所示,Stock類下的acquire函數(shù)作為Market的友元函數(shù)可以訪問market類的私有變量。

友元函數(shù)和類的成員函數(shù)的區(qū)別

友元函數(shù)和類的成員函數(shù)的區(qū)別成員函數(shù)有this指針,而友元函數(shù)沒有this指針。友元函數(shù)是不能被繼承的,就像父親的朋友未必是兒子的朋友。

以上是“C++中成員函數(shù)和友元函數(shù)有哪些區(qū)別”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

c++
AI