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< 呵呵,ostream os就是cout 所以cout node endl 就是先 cout node 根據friend ostream operator ostream os node temp 知輸出node,然後生成新的流物件cout,就變成了cout endl,又是cout 和endl的過載,... 過載運算 在需要過載的類中宣告 classname operator int i 就可以了。引數i是代表傳入的 括號中的值 索引 因為我們使用 的使用會用到類似 a i value的表示式去賦值,所以返回類的引用可以支援賦值操作。這裡有我修改的一段示例 上上西 給個示例,以樓上 為基礎,再包含標頭檔... 阿君 宣告為友元類,friend ostream operator 實現部分 ostream operator 書道聖儒 過載輸出運算子 include class ccomplex ccomplex double rv ccomplex double rv,double iv friend cco...c 輸出運算子過載問題,C 運算子過載 為什麼流運算子不能過載為成員函式?
C 怎樣過載下標運算子,C 運算子過載時過載賦值運算子和下標運算子時型別中的 是什麼意思?為什麼要加?
c 過載運算子用於輸出複數