国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++語(yǔ)言--友元類與嵌套類-8.1----友元類、嵌套類

2019-11-09 15:45:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
前言:C++系列到此結(jié)束。終于可以寫點(diǎn)簡(jiǎn)單的Jni了。感謝自己的努力?。?!友元是一種允許非類成員函數(shù)訪問(wèn)類的非公有成員的一種機(jī)制??梢园岩粋€(gè)函數(shù)指定為類的友元,也可以把整個(gè)類指定為另一個(gè)類的友元1.友元類

一、友元介紹我們知道,類的成員函數(shù)可以訪問(wèn)同類的其他成員函數(shù),包括公有、私有和保護(hù)成員。而類的外部函數(shù)只能訪問(wèn)類的公有成員。友元是一種允許非類成員函數(shù)訪問(wèn)類的非公有成員的一種機(jī)制。可以把一個(gè)函數(shù)指定為類的友元,也可以把整個(gè)類指定為另一個(gè)類的友元。

友元函數(shù)友元類

二、友元函數(shù)友元函數(shù)在類作用域外定義,但它需要在類體中進(jìn)行說(shuō)明為了與該類的成員函數(shù)加以區(qū)別,定義的方式是在類中用關(guān)鍵字friend說(shuō)明該函數(shù),格式如下:

friend  類型 友元函數(shù)名(參數(shù)表);友元的作用在于提高程序的運(yùn)行效率

友元函數(shù)注意事項(xiàng):1、友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問(wèn)對(duì)象的成員,必須用對(duì)象名加運(yùn)算符“.”加對(duì)象成員名。但友元函數(shù)可以訪問(wèn)類中的所有成員(公有的、私有的、保護(hù)的),一般函數(shù)只能訪問(wèn)類中的公有成員。

2、友元函數(shù)不受類中的訪問(wèn)權(quán)限關(guān)鍵字限制,可以把它放在類的公有、私有、保護(hù)部分,但結(jié)果一樣。

3、某類的友元函數(shù)的作用域并非該類作用域。如果該友元函數(shù)是另一類的成員函數(shù),則其作用域?yàn)榱硪活惖淖饔糜颍駝t與一般函數(shù)相同。

4、友元函數(shù)破壞了面向?qū)ο蟪绦蛟O(shè)計(jì)類的封裝性,所以友元函數(shù)如不是必須使用,則盡可能少用?;蛘哂闷渌侄伪WC封裝性。

代碼如下:
#include <math.h>#include <iostream>using namespace std;class Point{    friend double Distance(const Point &p1, const Point &p2);public:    Point(int x, int y);PRivate:    int x_;    int y_;};Point::Point(int x, int y) : x_(x), y_(y){}double Distance(const Point &p1, const Point &p2){    double dx = p1.x_ - p2.x_;    double dy = p1.y_ - p2.y_;    return sqrt(dx * dx + dy * dy);}int main(void){    Point p1(3, 4);    Point p2(6, 9);    cout << Distance(p1, p2) << endl;    return 0;}程序中Distance 是Point類的友元函數(shù),可以訪問(wèn)類的私有數(shù)據(jù)成員。

三、友元類如果某類B的成員函數(shù)會(huì)頻繁的存取另一個(gè)類A的數(shù)據(jù)成員, 而A的數(shù)據(jù)成員的Private/Protectd限制造成B存取的麻煩, B只能通過(guò)A的Public的成員函數(shù)進(jìn)行間接存取把B做成A類的友元類,即A類向B類開(kāi)放其Private/Protectd內(nèi)容, 讓B直接存取友元類:一個(gè)類可以作另一個(gè)類的友元友元類的所有成員函數(shù)都是另一個(gè)類的友元函數(shù)友元類的聲明:friend class 類名;

友元類注意事項(xiàng):1、友元關(guān)系是單向的2、友元關(guān)系不能被傳遞3、友元關(guān)系不能被繼承

TeleController.h :

代碼如下:

#ifndef  _TELE_CONTROLLER_H_#define _TELE_CONTROLLER_H_class Television;class TeleController{public:    void VolumeUp(Television &tv);    void VolumeDown(Television &tv);    void ChanelUp(Television &tv);    void ChanelDown(Television &tv);};#endif // _TELE_CONTROLLER_H_ TeleController.cpp :代碼如下:
#include "TeleController.h"#include "Television.h"void TeleController::VolumeUp(Television &tv){    tv.volume_ += 1;}void TeleController::VolumeDown(Television &tv){    tv.volume_ -= 1;}void TeleController::ChanelUp(Television &tv){    tv.chanel_ += 1;}void TeleController::ChanelDown(Television &tv){    tv.volume_ -= 1;} Television.h:代碼如下:
#ifndef _TELEVISION_H_#define _TELEVISION_H_class TeleController;class Television{    friend class TeleController;public:    Television(int volume, int chanel);private:    int volume_;    int chanel_;};#endif // _TELEVISION_H_Television.cpp:代碼如下:
#include "Television.h"Television::Television(int volume, int chanel) : volume_(volume), chanel_(chanel){} main.cpp:代碼如下:
#include "Television.h"#include "TeleController.h"#include <iostream>using namespace std;int main(void){    Television tv(1, 1);    TeleController tc;    tc.VolumeUp(tv);    return 0;}

將TeleController 類作為Television類的友元類,這樣TeleController 類的成員函數(shù)就都可以訪問(wèn)Television類的所有成員,包括私有2.嵌套類

概念:

    所謂嵌套類,就是在類中聲明的類。如下代碼中,類Inner就是一個(gè)嵌套類,類Outer是外圍類:

class Outer{    class Inner    {        std::string m_strInner;    };    std::string m_strOuter;};

可見(jiàn)性:

嵌套類對(duì)于外圍類:

嵌套類僅僅是聲明在外圍類內(nèi)部的類型,而不是外圍類的成員

外圍類不具備嵌套類所定義的成員

對(duì)于外圍類來(lái)說(shuō),嵌套類和其他的類沒(méi)有任何區(qū)別;外圍類能訪問(wèn)嵌套類對(duì)象的public成員,不能訪問(wèn)嵌套類對(duì)象的protected及private成員

外圍類對(duì)于嵌套類:

嵌套類不具備外圍類所定義的成員

嵌套類能訪問(wèn)外圍類的public成員,不能訪問(wèn)外圍類的protected及private成員

嵌套類對(duì)于外圍類外部的作用域:

無(wú)論嵌套類聲明為public、protected還是private,嵌套類對(duì)于外圍類任何成員可見(jiàn)

當(dāng)嵌套類在外圍類中聲明為public時(shí),對(duì)外圍類之外的作用域可見(jiàn),外圍類之外的作用域可通過(guò)“::”訪問(wèn)嵌套類;

以下代碼正確無(wú)誤,輸出“I an inner”

#include <iostream>#include <string>class Outer{public:    class Inner    {    public:        Inner():m_strInner("I an inner")        {        }        void PrintInner()        {            printf("%s", m_strInner.c_str());        }    private:        std::string m_strInner;    };};int main(void){    Outer::Inner inner;    inner.PrintInner();    getchar();    return 0;}

當(dāng)嵌套類在外圍類中聲明為protected或private時(shí),對(duì)外圍類之外的作用域不可見(jiàn)

以下代碼編譯錯(cuò)誤

include <iostream>#include <string>class Outer{    class Inner    {    public:        Inner():m_strInner("I an inner")        {        }        void PrintInner()        {            printf("%s", m_strInner.c_str());        }    private:        std::string m_strInner;    };};int main(void){    Outer::Inner inner;    inner.PrintInner();    getchar();    return 0;}

繼承性:

下面列出了嵌套類在基類中三種訪問(wèn)屬性和繼承的三種方式共9總組合,繼承之后嵌套類在派生類中的訪問(wèn)屬性

結(jié)合1和上文的“可見(jiàn)性”就可得出當(dāng)派生類作為嵌套類的外圍類,嵌套類和外圍類之間,嵌套類和外圍類之外的作用域之間的可見(jiàn)性了;這里就不一一列舉,留給讀者自己去驗(yàn)證


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 清新县| 桃园县| 上饶市| 吴堡县| 交口县| 扬中市| 高碑店市| 连城县| 鹤庆县| 肃北| 阳城县| 临泉县| 横峰县| 齐齐哈尔市| 虎林市| 万载县| 平和县| 汪清县| 昭觉县| 肇庆市| 拜泉县| 昌吉市| 美姑县| 娄烦县| 阿合奇县| 津南区| 平湖市| 黄山市| 中江县| 红原县| 麻栗坡县| 九寨沟县| 桐柏县| 鄂伦春自治旗| 阿坝| 建水县| 陈巴尔虎旗| 高碑店市| 霍林郭勒市| 文化| 商洛市|