c 的友元函式問題,C 友原函式求教

時間 2023-03-22 21:20:02

1樓:斂正雅

這據說是vc的一個經典bug。和namespace也有關。

只要含有using namespace std; 就會提示友員函式沒有訪問私有成員的許可權。

解決方法:去掉using namespace std;換成更小的名字空間。

例如: 含有#include 就要加上using std::string

含有#include 就要加上using std::fstream

含有#include 就要加上using std::cin; using std::cout; using std::

ostream; using std::istream; using std::endl; 等等,需要什麼即可通過using宣告什麼。

你這個程式只要將using namespace std;改成using std::ostream就能跑了。。

希望你有收穫!

2樓:匿名使用者

測試發現vc6無法在包含 #include 後定義<<,等等這些運算子。

估計是vc6自帶的標準庫有問題,vc2003以後的版本該**編譯正常。

解決方法。1. 升級開發工具,一勞永逸。

2. 修改類實現,避免定義與ostream類相關的操作符過載。

3樓:匿名使用者

1.把宣告和實現寫在一起好像行。

2.格式好像不對。

直接在類宣告裡加。

friend ostream &operator<<(ostream &os,const time &t)

c++友原函式求教?

4樓:郭子淦老師

c++友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend。

類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。

另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。

為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函式,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。

友元的作用在於提高程式的執行效率(即減少了型別檢查和安全性檢查等都需要的時間開銷),但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。

友元可以是一個函式,該函式被稱為友元函式;友元也可以是一個類,該類被稱為友元類。

友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣。

5樓:風兮美的

1.友元函式的簡單介紹。

為什麼要使用友元函式。

在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員(例如:智慧指標類的實現),那麼類a中該函式要是類b的友元函式。具體來說:為了。

使其他類的成員函式直接訪問該類的私有變數。即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式。

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

使用友元函式的優缺點。

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

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

2.友元函式的使用。

友元函式的引數:

因為友元函式沒有this指標,則引數要有三種情況:

要訪問非static成員時,需要物件做引數;

要訪問static成員或全域性變數時,則不需要物件做引數;

如果做引數的物件是全域性物件,則不需要物件做引數;

友元函式的位置。

因為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段且沒有區別。

友元函式的呼叫。

可以直接呼叫友元函式,不需要通過物件或指標。

友元函式的分類:

普通函式友元函式。

目的:使普通函式能夠訪問類的友元。

語法:宣告:friend + 普通函式宣告。

實現位置:可以在類外或類中。

實現**:與普通函式相同。

呼叫:類似普通函式,直接呼叫。

友元函式的友元函式

6樓:手機使用者

friend 型別名 友元函式名(形參表);

然後在類體外對友元函式進行定義,定義的格式和普通函式相同,但可以通過物件作為引數直接訪問物件的私有成員 :

1)必須在類的說明中說明友元函式,說明時以關鍵字friend開頭,後跟友元函式的函式原型,友元函式的說明可以出現在類的任何地方,包括在private和public部分;

2)注意友元函式不是類的成員函式,所以友元函式的實現和普通函式一樣,在實現時不用:指示屬於哪個類,只有成員函式才使用:作用域符號;

3)友元函式不能直接訪問類的成員,只能訪問物件成員,4)友元函式可以訪問物件的私有成員,但普通函式不行;

5)呼叫友元函式時,在實際引數中需要指出要訪問的物件,6)類與類之間的友元關係不能繼承。

7)一個類的成員函式也可以作為另一個類的友元,但必須先定義這個類。

C 中類的成員函式作為另類的友元函式的問題,問題在下面的中,希望解釋的詳細點,謝謝了

student不是一個類名嗎?怎麼成形參的引數型別了 類也是一個型別啊 當然可以做為一個函式的形參型別啦 這裡的c是student的物件吧,用在這裡的意思是要呼叫score吧?嗯,為了讓teacher物件呼叫student物件的私有成員 這個wc是student的物件,怎麼不能用c 為什麼要用wc ...

c 解構函式問題,c 解構函式的問題

1 不是不能定義,是定義了沒意義。因為建構函式不被繼承,而虛擬函式是要在派生類中重定義的2 定義虛解構函式後,由於多型,當使用基類指標指向派生類物件時,會呼叫派生類的虛構函式,然後派生類的解構函式自動呼叫基本解構函式。不是虛的話,直接呼叫基類的解構函式了。如果派生類中有用new分配的記憶體,就無法釋...

c 建構函式過載,C 建構函式過載的問題?

應該是object 1 10 呼叫 sum int object 2 10.5 呼叫 sum double 因為c 在呼叫函式是會自動識別資料型別,如果你把10改為10.0,也是呼叫sum double 了 主要看你的引數是什麼型別的,如果是整型就呼叫sum int 浮點型的呼叫sum double...