C運算子過載為什麼流運算子不能過載為成員函式

2021-03-07 06:58:40 字數 1876 閱讀 1086

1樓:隔壁的蟲子

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

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

2樓:匿名使用者

試想一下這一點:

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

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

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

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

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

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

3樓:匿名使用者

class t;

t t;

成員的話,得這麼用了

t<

而不是cout<

而且也無法鏈式使用了

cout<

c++中運算子=為什麼必須過載為類的成員函式

4樓:匿名使用者

假設有個類a,如下語句:a a;a b=a;

這時候的複製運算子會起作用,而且是專以成員函式被呼叫的屬,等價於b.operate=(a)。如果不是成員函式,那麼不能這樣使用。

另外,必須過載說法是有問題的,只有類裡面有指標成員的時候才需要過載

為什麼c++賦值運算子過載函式不能被繼承

5樓:千鋒教育

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

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

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

c++中的過載運算子<<和>>為什麼是只可以為友元函式,不可是成員函式?我覺得沒問題呀, 10

6樓:匿名使用者

如果是過載雙目來操作符(即為類源

的成員函式),就只要設定一個引數作為右側運算量,而左側運算量就是物件本身。。。。。。

而 >> 或<< 左側運算量是 cin或cout 而不是物件本身,所以不滿足後面一點。。。。。。。。就只能申明為友元函式了。。。

如果一定要宣告為成員函式,只能成為如下的形式:

ostream & operator<<(ostream &output)

所以在運用這個《運算子時就變為這種形式了:data<

不合符人的習慣。

運算子》和》有什麼區別,C 中 運算子和 運算子有什麼區別

表示是帶符號的右移 按照二進位制把數字右移指定數位,符號位為正補零,符號位負補一,低位直接移除。表示無符號的右移 按照二進位制把數字右移指定數位,高位直接補零,低位移除。區別 在傳遞時也把符號一起傳遞,比如 3 2在傳遞再傳出時依然是 3 2,而使用 時就會統一變為3 2。帶符號於無符號的差別就在此...

請教關於c 運算子過載的問題,謝謝

如果不用 實際上語法是沒錯的呢?而且執行也是可以的呢?答案是yes,引用array v表示回的含義是v和傳入的函答數實參共用一片記憶體區域,對v進行賦值等操作也會對傳入的實參造成修改,如果不用 的話那在過載函式中所使用的變數v就是實參的一個副本,也即另外開闢一片記憶體區域再複製一份與函式實參一模一樣...

C中得運算子過載是什麼概念啊

一個自定義的類,一般是沒有諸如 或者其他的操作的,為了程式設計方便一點,就出現了運算子過載,就是為了定義這些操作符針對自定義類的操作。操作符即是函式 a b 等價於 operator a,b operator 就是 號的函式名字自定義的類不能直接使用a b這樣的形式,因為operator 不接受自定...