【C++ Primer】第十五章 友元、異常和其他 –之一—>友元和嵌套類

來源:互聯網
上載者:User

一,友元

       1)可以將類作為友元,友元類的所有方法都可以訪問原始類的私人成員和保護成員。

       2)下面例子介紹了 電視類和遙控器類,其中遙控器類為電視類的友元類

       3)注意:友元關係不具對稱性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元關係不具傳遞性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。

#include <iostream><br />using namespace std;<br />class TV<br />{<br />private:<br />int state;// on or off<br />int volume; //assumed to be digitized<br />int maxchannel;// maximum number of channels<br />int channel;//current channel settings<br />int mode;//broadcast or cable<br />int input;//tv or vcr<br />public:<br />friend class Remote;//遙控器類<br />enum{off,on}; //枚舉<br />enum{minval,maxval=20};<br />enum{antenna,cable};<br />enum{tv,vcr};</p><p>TV(int s=off,int mc=100):state(s),volume(5),maxchannel(mc),channel(2),mode(cable),input(tv){} //建構函式</p><p>void onoff(){<br />state=(state == on)?off:on;<br />}<br />bool ison()const{<br />return state == on;<br />}<br />bool volup();<br />bool voldown();<br />void chanup();<br />void chandown();<br />void set_mode(){<br />mode = (mode == antenna)?cable:antenna;<br />}<br />void set_input(){<br />input=(input == tv)?vcr:tv;<br />}<br />void settings()const;<br />} ;</p><p>class Remote//遙控器友元類<br />{<br />private:<br />int mode;<br />public:<br />Remote(int m=TV::tv):mode(m){} //遙控的是電視而不是 vcr<br />bool volup(TV &t){ //遙控器的操作都是來源於電視對自身的操作 ,所以友元遙控器的方法都是調用電視的成員函數<br />return t.volup();<br />}<br />bool voldown(TV &t){<br />return t.voldown();<br />}<br />void onoff(TV &t){<br />return t.onoff();<br />}<br />void chanup(TV &t){<br />return t.chanup();<br />}<br />void chandown(TV &t){<br />return t.chandown();<br />}<br />void set_chan(TV &t,int c){ //唯一需要作為友元的方法,因為它用來訪問TV類的private成員<br />t.channel=c;<br />}<br />void set_mode(TV &t){<br />t.set_mode();<br />}<br />void et_input(TV &t){<br />t.set_input();<br />}</p><p>};<br /> /*下面是電視的成員方法實現*/<br /> bool TV::volup()<br /> {<br /> if(volume<maxval)<br /> {<br /> volume++;<br /> return true;<br /> }<br /> else<br /> return false;<br /> }<br />bool TV::voldown()<br />{<br />if(volume>minval)<br /> {<br /> volume--;<br /> return true;<br /> }<br /> else<br /> return false;</p><p>}<br />void TV::chanup()<br />{<br />if(channel<maxchannel)<br /> channel++;<br /> else<br /> channel=1;</p><p>}<br />void TV::chandown()<br />{<br />if(channel>1)<br /> channel--;<br /> else<br /> channel=maxchannel;</p><p>}<br />void TV::settings()const<br />{<br />cout<<"tv is "<<(state == off?"on":"off")<<endl;<br />if(state == on)<br />{<br />cout<<"volume setting ="<<volume<<endl;<br />cout<<"channel setting ="<<channel<<endl;<br />cout<<"Mode ="<<(mode == antenna?"cable":"antenna")<<endl;<br />cout<<"Input ="<<(input == tv?"vcr":"tv")<<endl;<br />}</p><p>}</p><p>int main()<br />{<br />TV s27;<br />cout<<"initinal settings for 27\" tv:\n";<br />s27.settings();<br />s27.onoff();<br />s27.chanup();<br />cout<<"adjust settings for 27\"tv:";<br />s27.settings();</p><p>return 0;<br />}<br />輸出為:

二,嵌套類

       1)嵌套與包含的區別

             包含意味著將類對象作為另一個類的成員

             對類進行嵌套,不建立類成員,而是定義了一種類型,該類型僅在包含嵌套類的類中使用。struct (結構)實際上是一種嵌套類

        2)嵌套類和存取權限

聲明位置 包含它的類是否可以使用 從包含它的類派生出來的類,是否可以使用 外部世界是否可以使用
私人部分
保護部分
共有部分

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.