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

2021-08-08 21:14:33 字數 2377 閱讀 1526

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 運算子過載

其實第一個回答的程式已經ok了,這裡簡要說明一下 首先,名稱空間的問題。cout endl以及ostream都是定義在std這個名稱空間下的,因此在使用前必須包含這個一個using指示 using namespace std 表明可以使用std裡面的所有內容。除此以外還有兩種選擇 1.使用作用域運算...

C 運算子過載

其實很簡單,只要你對類的建構函式和解構函式了解的差不多。首先說第一個問題 為什麼會突然出現 string t p 在函式 string operator const char p 中,它接受一個字元指標p,返回一個string類物件,這個你懂吧?這就好辦了,這個函式想返回一個string類物件,必須...

C運算子過載

我想樓主主要是想看到過載函式的實現過程,所以我自動給參加運算的複數付值。考慮你是初學者,我都用的是很簡單的語句寫的,都是一看就懂的句子。include using namespace std class complex private double m image 描述實部 double m rea...