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< 這個呼叫的預設拷貝函式 this實際上就是呼叫成 copy員函式的物件地址。如 time1.display 若display 裡有用到this的話,this的值其實為 time1,所以 this time1.time time operator int 這個是後加加的函式原型,後 其實是先儲存值,在... 第一行是引用,是傳地址呼叫函式,在呼叫函式時會減少複製物件的開銷。這時,形參就是實參的一個引用,對形參的修改會影響到實參。第二行的傳值呼叫,所謂的傳值呼叫是指把實參複製給形參,形參和實參是兩個獨立的個體,形參是實參在記憶體上的另一個拷貝,對形參的一切修改一般不會影響到實參。如,對於第二個宣告有以下函... 最大的錯誤在於沒有理解運算子過載,如 class a 其中的運算子函式呼叫,相當於,下面的函式呼叫 物件 operator 運算子 如果單單寫 int operator rmb rmb,int i 如果c 認為這個是正確的,那麼在 rmb r r 1 10 和int a 4 a 1 1 c 怎麼能判...關於C 中過載自增運算子
有關c 過載運算子的問題
請問 c 中,這樣過載運算子對不對