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< 不合符人的習慣。 只拿了你有疑問的兩個函式出來討論,看是否明白 time time operator 這是字首 return this time time operator int 這是字尾 return temp time operator 這表示前 即 time1 呼叫該函式 time operator int ... 問題出在 void operator string ob1 這一句,可以改成 void operator string ob1 原因在於 引數 string ob1 相當於是個臨時變數,他的值是,ob2的拷貝,但是它的生命週期在 以後就到頭了,也就是說就析構了。看你的string類裡有個 char ... 就是可以定義新的運算方法,比如虛數的 法,你定義2個虛數,直接用 是不行的,系統不認,你必須自己寫個過載,讓實部和實部相加,虛部和虛部相加,你先了解下什麼叫函式過載就能更好理解了。過載就是說你對系統給的不滿意,無法滿足你自己的需求,然後你寫個能滿足自己的需求代替系統的,當然只在這個類裡有效。就是用函...C 過載 運算子的問題,c 運算子過載問題
C 運算子過載
c 過載運算子的作用是什麼,C 中 運算子過載 到底有什麼何意義?