為什麼C 過載賦值運算子必須要用成員函式而不能用普通或者友元

時間 2021-08-11 17:42:29

1樓:匿名使用者

1、既然是操作符過載,就必然會訪問類的私有成員變數,根據類的封裝性要求,除了友元函式外,其他任何外部操作都是違規的,所以不能用普通函式來過載操作符。

2、賦值操作符的過載函式在沒有顯式定義的情況下,編譯程式會自動生成,即使類成員變數包含有指標,也會將指標的值給予複製,所以往往會造成多個例項共享一個儲存空間的尷尬局面,當最先定義的類被析構後,尚存的例項還在指向已被釋放的儲存空間,從而造成成員變數的值已經銷燬,而該例項還存在的難以接受的現實。

3、賦值函式是建構函式的過載,不是普通的成員函式,不能用物件來呼叫,該函式只需一個同型別的引數,且以常量、引用的方式出現,而友元函式的引數與被過載的運算子要求的數量一致,比如+,-、*、/等都需要兩個引數,這些概念與數學概念類似,而賦值操作符=在數學概念中不是運算子,所以說,運算子過載的友元函式的引數不會低於2個(這些運算子是數學概念中的運算子)。

2樓:匿名使用者

那是因為賦值運算子是單目運算子,注意看賦值是怎麼運用的j = i;

不想加法之類的雙目運算子

j = 5 + 6;

你難道想定義一個這樣的普通函式在表達賦值?

const int& operator = (const int& val)

請問你覺不覺得它非常的怪,基本上就是一個沒用的函式。

3樓:匿名使用者

可以用友元和普通函式的,但是你用成員函式中,函式引數中有個隱藏的引數,進行函式呼叫時,會把呼叫物件的地址(this指標)傳進函式,友元和普通函式是沒有這個引數的;

而且過載》 和 《必須用友元或者普通函式(這個前提是不訪問類的私有成員)

為什麼c++運算子過載只能過載為成員函式或友元函式

4樓:晉凡邗人

倘若你是用vc6做編譯器的話,那麼**的開頭應該寫成:

#include

不寫成:

#include

using

namespace

std;

就是用上面的一行替代下面的兩行。

因為vc6這個編譯器不支援在iostream做標頭檔案的時候執行友元函式。

5樓:安暄和墨歌

1、既然是操作符過載,就必然會訪問類的私有成員變數,根據類的封裝性要求,除了友元函式外,其他任何外部操作都是違規的,所以不能用普通函式來過載操作符。

2、賦值操作符的過載函式在沒有顯式定義的情況下,編譯程式會自動生成,即使類成員變數包含有指標,也會將指標的值給予複製,所以往往會造成多個例項共享一個儲存空間的尷尬局面,當最先定義的類被析構後,尚存的例項還在指向已被釋放的儲存空間,從而造成成員變數的值已經銷燬,而該例項還存在的難以接受的現實。

3、賦值函式是建構函式的過載,不是普通的成員函式,不能用物件來呼叫,該函式只需一個同型別的引數,且以常量、引用的方式出現,而友元函式的引數與被過載的運算子要求的數量一致,比如+,-、*、/等都需要兩個引數,這些概念與數學概念類似,而賦值操作符=在數學概念中不是運算子,所以說,運算子過載的友元函式的引數不會低於2個(這些運算子是數學概念中的運算子)。

c++運算子過載:為什麼流運算子不能過載為成員函式?

6樓:隔壁的蟲子

class object如果實現了成員operator<< ,呼叫其物件格式o<載運算子為成員函式後,當呼叫該運算子時,左運算元必須是該類的例項。友元函式 流引數定義第一個引數.才能呼叫cout<

雖然不能“過載”為成員函式,但是可以定義為新的成員函式,只不過使用習慣和常例不符而已。

7樓:匿名使用者

試想一下這一點:

將我們的類派生於ostream,也就是做為流類的子類,這樣,不就可以將插入運算子宣告為成員函式,並且用法也與友元方式下一樣了嗎?

那麼為什麼還要宣告為友元呢?原因上面回答者也說了一些。。。

不能過載的根本原因在於,

大部份的標準庫實現中,對ostream,istream類體系採用了建構函式保護繼承的方式。。。致使即使以繼承的方式來擴充套件流類,也會在物件例項化時遭遇阻礙。。。

另一方面,標準庫中的流類,其插入符函式沒有宣告為虛擬函式,因此子類不能對其實現進行覆蓋,所以也使成員函式過載遭遇到實質的困難。。。

總的來說,c++標準i/o庫非常繁雜且難,其實現思想很多都與常規的oop有所出入。。。在使用的時候要謹慎,並最好遵從慣例。。。

8樓:匿名使用者

class t;

t t;

成員的話,得這麼用了

t<

而不是cout<

而且也無法鏈式使用了

cout<

c 輸出運算子過載問題,C 運算子過載 為什麼流運算子不能過載為成員函式?

呵呵,ostream os就是cout 所以cout node endl 就是先 cout node 根據friend ostream operator ostream os node temp 知輸出node,然後生成新的流物件cout,就變成了cout endl,又是cout 和endl的過載,...

C 怎樣過載下標運算子,C 運算子過載時過載賦值運算子和下標運算子時型別中的 是什麼意思?為什麼要加?

過載運算 在需要過載的類中宣告 classname operator int i 就可以了。引數i是代表傳入的 括號中的值 索引 因為我們使用 的使用會用到類似 a i value的表示式去賦值,所以返回類的引用可以支援賦值操作。這裡有我修改的一段示例 上上西 給個示例,以樓上 為基礎,再包含標頭檔...

c 過載運算子用於輸出複數

阿君 宣告為友元類,friend ostream operator 實現部分 ostream operator 書道聖儒 過載輸出運算子 include class ccomplex ccomplex double rv ccomplex double rv,double iv friend cco...