C 中的friend函式詳細解析

2022-09-27 02:09:17 字數 2677 閱讀 2891

為什麼要使用友元函式

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

實際上具體大概有下面兩種情況需要使用友元函式:(1)運算子過載的某些場合需要使用友元。(2)兩個類要共享資料的時候。

使用友元函式的優缺點

優點:能夠提高效率,表達簡單、清晰。

缺點:友元函式破環了封裝機制,盡量不使用成員函式,除非不得已的情況下才使用友元函式。

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

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

友元函式的實現可以在類外定義,但必須在類內部宣告

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

但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend。

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

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

1.普通的非成員函式友元

#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 程式設計客棧

system("pause");

return 0; }

2.類作為友元

類作為友元需要注意的是友元類和原始類之間的相互依賴關係,如果在友元類中定義的函式使用到了原始類的私有變數,那麼就需要在友元類定義的檔案中包含原始類定義的標頭檔案。但是在原始類的定義中(包含友元類宣告的那個類),就不需要包含友元類的標頭檔案.

另外,不需要在類定義前去宣告友元類,因為友元類的宣告自身就是bdwxncon一種宣告。

#pragma once

#include

using namespace std;

class a

;

#include "a.h"

a::a()

a::~a(void)

#pragma once

cbdwxnconlass 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函式詳細解析

本文位址:

C 中的friend詳細解析

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

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

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

C 中的友元函式friend

class int 友元函式的定義 void print const int obj int obj print obj 直接調用友元函式,不需要使用物件或者指標!下面例項是友元類的使用,詳細見下面的例項 class box 成員函式的定義 void box setwidth double wid ...