程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++學習之友元函數

C++學習之友元函數

編輯:C++入門知識

為什麼要引入友元函數?
因為我們不能在類的外部訪問類的私有變量。

傳統的訪問方法:


//============================================================================ 
// Name        : main.cpp 
// Author      : ShiGuang 
// Version     : 
// Copyright   : [email protected] 
// Description : Hello World in C++, Ansi-style 
//============================================================================ 
 
#include <iostream> 
#include <string> 
using namespace std; 
 
class aa 

private: 
    float a; 
    float b; 
public: 
    float &aaa() 
    { 
        return (a); 
    } 
    float &bbb() 
    { 
        return (b); 
    } 
}; 
 
aa sum(aa a, aa b) 

    aa c; 
    c.aaa() = a.aaa() + b.aaa(); 
    c.bbb() = a.bbb() + b.bbb(); 
    return (c); 

 
int main(int argc, char **argv) 

    aa a, b; 
    a.aaa() = 1; 
    a.bbb() = 2; 
    b.aaa() = 3; 
    b.bbb() = 4; 
    aa c = sum(a, b); 
    cout << c.aaa() << endl; 
    cout << c.bbb() << endl; 
 
    return 0; 

引入友元函數之後:

//============================================================================ 
// Name        : main.cpp 
// Author      : ShiGuang 
// Version     : 
// Copyright   : [email protected] 
// Description : Hello World in C++, Ansi-style 
//============================================================================ 
 
#include <iostream> 
#include <string> 
using namespace std; 
 
class aa 

private: 
    float a; 
    float b; 
public: 
    float &aaa() 
    { 
        return (a); 
    } 
    float &bbb() 
    { 
        return (b); 
    } 
    friend aa sum(aa, aa); 
    friend int main(int argc, char **argv); 
}; 
 
aa sum(aa s, aa t) 

    aa c; 
    c.a = s.a + t.a; 
    c.b = s.b + t.b; 
    return (c); 

 
int main(int argc, char **argv) 

    aa a, b; 
    a.a = 1; 
    a.b = 2; 
    b.a = 3; 
    b.b = 4; 
    aa c = sum(a, b); 
    cout << c.a << endl; 
    cout << c.b << endl; 
 
    return 0; 

兩個函數運行結果完全一樣。www.2cto.com
對於使用友元:
(1)聲明的位置既可在public區,也可在protected區。友元函數雖然是在類內進行聲明,但它不是該類的成員函數,不屬於任何類。
(2)在類外定義友元函數,與普通函數的定義一樣,一般與類的成員函數放在一起,以便類重用時,一起提供其友元函數。
(3) 友元函數是能訪問類的所有成員的普通函數,一個函數可以是多個類的友元函數,只需在各個類中分別聲明。
(4)友元能使程序精煉,提高程序的效率。
(5)友元破壞了類的封裝,使用時,要權衡利弊,在數據共享與信息隱藏之間選擇一個平衡點。

 摘自 sg131971的學習筆記

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved