C 中的friend詳細解析

2021-07-16 01:50:51 字數 2270 閱讀 6547

c++中的友元機制允許類的非公有成員被乙個類或者函式訪問,友元按型別分為三種:普通非類成員函式作為友元,類的成員函式作為友元,類作為友元。友元包括友元的宣告以及友元的定義。友元的宣告預設為了extern,就是說友元類或者友元函式的作用域已經擴充套件到了包含該類定義的作用域,所以即便我們在類的內部定義友元函式也是沒有關係的。

友元可以是乙個函式,該函式被稱為友元函式;友元也可以是乙個類,該類被稱為友元類。友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣。

友元函式

的實現可以在類外定義,

但必須在類內部宣告

友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,

但需要在類的定義中加以宣告,

宣告時只需在友元的名稱前加上關鍵字friend。

我們已知道類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。

為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函式,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率(即減少了型別檢查和安全性檢查等都需要的時間開銷),但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。

#include "cmath"

#include "iostream"

using namespace std;

class point

void getxy();

friend double distance(point &a,point &b);

protected:

private:

double x,y;

};void point::getxy()

void getxy();

friend double distance(point &a,point &b);

friend ostream &operator <<(ostream &a,point &b);

protected:

private:

double x,y;

};// friend ostream& operator<<(ostream& o,a& another);

ostream &operator <<(ostream &out,point &b) //在類中宣告的時候,可以是ostream &a,函式定義的時候也可以是ostream &out

; #include "a.h"

a::a()

a::~a(void)

#pragma once

class b

; #include "stdafx.h"

#include "b.h"

#include "a.h" //must include a.h

#include b::b(void)

b::~b(void)

int b::func()

~a(void){}

private:

int mx;

int my;

};

#pragma once

class a;

class b

;

#include "b.h"

#include "a.h"

b::b(void)

b::~b(void)

int b::func(a xx)

#include "a.h"

#include "b.h"

#include using namespace std;

void main()

; cmysingleton(const cmysingleton &lxsington) {};

~cmysingleton(){};

};cmysingleton& instancemec()

C 中的friend函式詳細解析

為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式...

C 中的friend友元函式詳細解析

友元可以是乙個函式,該函式被稱為友元函式 友元也可以是乙個類,該類被稱為友元類。友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣 友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要...

C 中的物件陣列詳細解析

類是物件的抽象,我們可以使用乙個類來定義很多的物件,然後每個物件都有自己的屬性。當我們使用類來定義很多相同結構的物件的時候,我們可以採取物件陣列的方法。例如,乙個班有50個學生,我們定義了乙個學生類,該類的學生具有相同的資料成員和成員函式,我們就可以定義乙個這樣的陣列。複製 如下 student s...