欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中友元的詳解及其作用介紹

 更新時(shí)間:2021年09月07日 11:08:27   作者:我是小白呀  
這篇文章主要介紹了C++中友元的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

概述

類(lèi)的友元函數(shù) (friend) 是定義在類(lèi)外部, 但是有權(quán)限訪(fǎng)問(wèn)類(lèi)的所有私有 (private) 成員和保護(hù) (protected) 成員.

在這里插入圖片描述

友元

我們先來(lái)復(fù)習(xí)一下公有成員和私有成員的概念:

  • 公有成員 (public) : 在類(lèi)外可以訪(fǎng)問(wèn)
  • 私有成員 (private): 只有本類(lèi)中的函數(shù)可以訪(fǎng)問(wèn)

友元 (friend) 可以訪(fǎng)問(wèn)與其有好友關(guān)系的類(lèi)中的私有成員 (有限制的共享).

友元包括友元函數(shù)和友元類(lèi):

  • 友元函數(shù): 如果在本類(lèi)以外的其他地方定義的函數(shù), 在類(lèi)體重用 friend 進(jìn)行聲明. 此函數(shù)就稱(chēng)為本類(lèi)的有元函數(shù), 友元函數(shù)可以訪(fǎng)問(wèn)這個(gè)類(lèi)中的私有成員
  • 友元類(lèi): 類(lèi) A 將另一個(gè)類(lèi) B 聲明為其友元類(lèi), 友元類(lèi) B 中的所有函數(shù)都是 A 類(lèi)的友元函數(shù), 可以訪(fǎng)問(wèn) A 類(lèi)中的所有成員

普通的友元函數(shù)

Time 類(lèi):

#ifndef PROJECT2_TIME_H
#define PROJECT2_TIME_H

class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();
    Time(int, int, int);
    friend void display(Time &);  // display是Time類(lèi)的friend函數(shù)
};

#endif //PROJECT2_TIME_H

Time.cpp:

#include <iostream>
#include "Time.h"
using namespace std;

Time::Time() : hour(0), minute(0), second(0) {}

Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

void display(Time &t) {
	// display不是Time類(lèi)的成員函數(shù), 但是可以引用Time中的私有成員
    cout << t.hour << ":" << t.minute << ":" << t.second << endl;
}

main:

#include "Time.h"
#include <iostream>
using namespace std;

int main() {

    Time t1(8, 8, 8);
    display(t1);

    return 0;
}

友元成員函數(shù)

Time 類(lèi):

#ifndef PROJECT2_TIME_H
#define PROJECT2_TIME_H

class Date;  // 對(duì)Date類(lèi)進(jìn)行提前引用聲明
class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();
    Time(int, int, int);
    void display(Date &d);
};

#endif //PROJECT2_TIME_H

Date 類(lèi):

#ifndef PROJECT2_DATE_H
#define PROJECT2_DATE_H

#include "Time.h"

class Date {
private:
    int year, month, day;
public:
    Date(int, int, int);
    friend void Time::display(Date &d);
};

#endif //PROJECT2_DATE_H

Time.cpp:

#include <iostream>
#include "Time.h"
#include "Date.h"
using namespace std;

Time::Time() : hour(0), minute(0), second(0) {}

Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

void Time::display(Date &d) {
    cout << d.year << "年" << d.month << "月" << d.day << "日" <<endl;
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include "Date.h"
#include <iostream>
using namespace std;

int main() {

    Time t1(8, 8, 8);
    Date d1(2021, 5, 6);
    t1.display(d1);

    return 0;
}

輸出結(jié)果:

2021年5月6日
8:8:8

我們可以發(fā)現(xiàn) display 不是 Date 類(lèi)的成員函數(shù), 但是可以引用 Date 中的私有成員.

友元類(lèi)

Time 類(lèi):

#ifndef PROJECT2_TIME_H
#define PROJECT2_TIME_H

class Date;  // 對(duì)Date類(lèi)進(jìn)行提前引用聲明
class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();
    Time(int, int, int);
    void display(Date &d);
};

#endif //PROJECT2_TIME_H

Date 類(lèi):

#ifndef PROJECT2_DATE_H
#define PROJECT2_DATE_H

#include "Time.h"

class Date {
private:
    int year, month, day;
public:
    Date(int, int, int);
    friend class Time;  // 友元類(lèi)
};

#endif //PROJECT2_DATE_H

總結(jié)

  • 如果在本類(lèi)以外的地方定義了一個(gè)函數(shù)在類(lèi)體中用 friend 對(duì)其進(jìn)行聲明, 此函數(shù)就稱(chēng)為本類(lèi)的友元函數(shù)
  • 友元函數(shù)可以訪(fǎng)問(wèn)這個(gè)類(lèi)中的私有成員
  • 友元函數(shù)可以是不屬于任何類(lèi)的非成員函數(shù), 也可以是其他類(lèi)的成員函數(shù)
  • 一個(gè)函數(shù)可以被多個(gè)類(lèi)聲明為 friend, 這樣就可以引用多個(gè)類(lèi)中的私有數(shù)據(jù).

友元的性質(zhì):

  • 友元的關(guān)系是單向的而不是雙向的
  • 友元的關(guān)系不能傳遞

友元的優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn): 有助于數(shù)據(jù)共享, 提高程序效率
  • 缺點(diǎn): 破壞了封裝原則, 不利于信息隱藏

我們?cè)谑褂糜言臅r(shí)候, 應(yīng)當(dāng)時(shí)刻考慮友元的缺點(diǎn). 如果能用公共成員函數(shù)解決就不必用友元.

在這里插入圖片描述

到此這篇關(guān)于C++中友元的詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++友元內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++超詳細(xì)講解拷貝構(gòu)造函數(shù)

    C++超詳細(xì)講解拷貝構(gòu)造函數(shù)

    我們經(jīng)常會(huì)用一個(gè)變量去初始化一個(gè)同類(lèi)型的變量,那么對(duì)于自定義的類(lèi)型也應(yīng)該有類(lèi)似的操作,那么創(chuàng)建對(duì)象時(shí)如何使用一個(gè)已經(jīng)存在的對(duì)象去創(chuàng)建另一個(gè)與之相同的對(duì)象呢
    2022-06-06
  • C語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)交鶖?shù)排序

    C語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)交鶖?shù)排序

    這篇文章主要介紹了C語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)交鶖?shù)排序的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C語(yǔ)言字符串函數(shù)模擬實(shí)現(xiàn)流程介紹

    C語(yǔ)言字符串函數(shù)模擬實(shí)現(xiàn)流程介紹

    字符串函數(shù)(String processing function)也叫字符串處理函數(shù),指的是編程語(yǔ)言中用來(lái)進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長(zhǎng)度,字符查找等的函數(shù)
    2022-09-09
  • C++實(shí)現(xiàn)字符串切割的兩種方法

    C++實(shí)現(xiàn)字符串切割的兩種方法

    這篇文章主要介紹了C++實(shí)現(xiàn)字符串切割的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • C++ vector的基本使用示例詳解

    C++ vector的基本使用示例詳解

    這篇文章主要介紹了C++ vector的基本使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C++存儲(chǔ)鏈接性原理詳解

    C++存儲(chǔ)鏈接性原理詳解

    這篇文章主要為大家介紹了C++存儲(chǔ)鏈接性原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    本文主要介紹C語(yǔ)言 結(jié)構(gòu)體和指針,這里整理了相關(guān)資料,并附示例代碼和實(shí)現(xiàn)結(jié)果,以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí)C語(yǔ)言的朋友
    2016-08-08
  • C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解

    C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解

    這篇文章主要介紹了C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • 理解數(shù)據(jù)結(jié)構(gòu)

    理解數(shù)據(jù)結(jié)構(gòu)

    本文是對(duì)數(shù)據(jù)結(jié)構(gòu)對(duì)編程的重要性,數(shù)據(jù)結(jié)構(gòu)對(duì)數(shù)據(jù)存儲(chǔ),數(shù)據(jù)處理,內(nèi)存工作,從宏觀(guān)上理解數(shù)據(jù)結(jié)構(gòu)
    2016-07-07
  • C++內(nèi)存泄漏及檢測(cè)工具詳解

    C++內(nèi)存泄漏及檢測(cè)工具詳解

    最簡(jiǎn)單的方法當(dāng)然是借助于專(zhuān)業(yè)的檢測(cè)工具,比較有名如BoundsCheck,功能非常強(qiáng)大,相信做C++開(kāi)發(fā)的人都離不開(kāi)它。此外就是不使用任何工具,而是自己來(lái)實(shí)現(xiàn)對(duì)內(nèi)存泄露的監(jiān)控
    2013-10-10

最新評(píng)論