C 中比較運算子過載,兩個引數都是類物件,為何還要是有友元?而且不適用友元還會報錯

時間 2021-09-02 07:14:46

1樓:匿名使用者

因為3個方法都不是類成員函式,想寫在類裡面,就要用友元函式

你也可以不用友元函式,但要用類作用域引用

class string

string(char *str);

bool operator>

bool operator<

bool operator==

void display();

private:

char *p;

};bool string::operator> (string& string1,string& string2)

bool string::operator<

2樓:匿名使用者

這是經驗,一般過載運算子都要宣告為友元的,這沒有為什麼,記住就行了

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

3樓:匿名使用者

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

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

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

4樓:匿名使用者

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

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

j = 5 + 6;

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

const int& operator = (const int& val)

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

5樓:匿名使用者

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

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

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

6樓:匿名使用者

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

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

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

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

ostream & operator<<(ostream &output)

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

不合符人的習慣。

C 過載 運算子的問題,c 運算子過載問題

只拿了你有疑問的兩個函式出來討論,看是否明白 time time operator 這是字首 return this time time operator int 這是字尾 return temp time operator 這表示前 即 time1 呼叫該函式 time operator int ...

C 運算子過載

問題出在 void operator string ob1 這一句,可以改成 void operator string ob1 原因在於 引數 string ob1 相當於是個臨時變數,他的值是,ob2的拷貝,但是它的生命週期在 以後就到頭了,也就是說就析構了。看你的string類裡有個 char ...

c 過載運算子的作用是什麼,C 中 運算子過載 到底有什麼何意義?

就是可以定義新的運算方法,比如虛數的 法,你定義2個虛數,直接用 是不行的,系統不認,你必須自己寫個過載,讓實部和實部相加,虛部和虛部相加,你先了解下什麼叫函式過載就能更好理解了。過載就是說你對系統給的不滿意,無法滿足你自己的需求,然後你寫個能滿足自己的需求代替系統的,當然只在這個類裡有效。就是用函...