C++运算符重载(10)
編譯器在默認(rèn)情況下為每個類生成一個默認(rèn)的賦值操作,用于同類的兩個對象之間相互賦值。默認(rèn)的含義是逐個為成員賦值,即將一個對象的成員的值賦給另一個對象相應(yīng)的成員,這種賦值方式對于有些類可能是不正確的。
運算符重載形式有兩種,重載為類的成員函數(shù)和重載為類的友元函數(shù)。
C++的關(guān)鍵字“operator”和運算符一起使用就表示一個運算符函數(shù)。例如“operator +”表示重載“+”運算符。
運算符實質(zhì)
C++是由函數(shù)組成的,在C++內(nèi)部,任何運算都是通過函數(shù)來實現(xiàn)的。因為任何運算都是通過函數(shù)來實現(xiàn)的,所以運算符重載其實就是函數(shù)重載,要重載某個運算符,只要重載相應(yīng)的函數(shù)就可以了。與以往稍有不同的是,需要使用新的關(guān)鍵字“operator”,它和C++的一個運算符連用,構(gòu)成一個運算符函數(shù)名,例如“operator+”.通過這種構(gòu)成方法就可以像重載普通函數(shù)那樣重載運算符函數(shù)operator+()。由于C++已經(jīng)為各種基本數(shù)據(jù)類型定義了該運算函數(shù),所以只需要為自己定義的類型重載operator+()就可以了。
C++的運算符大部分都可以重載,不能重載的只有. 、:: 、* 和 ?: 。前面三個是因為在C++中都有特定的含義,不準(zhǔn)重載以避免不必要的麻煩;“?:”則是因為不值得重載。另外,“sizeof”和“#”不是運算符,因而不能重載,而=、()、[ ] 、->這4個運算符只能用類運算符來重載。
運算符重載實例
格式為
函數(shù)類型 operator 運算符(形參表) { 函數(shù)體; }?
ostream &operator<<(ostream & output,類名 &對象名) { return output; }output是類ostream對象的引用,它是cout的別名,即ostream&output=cout。調(diào)用參數(shù)時,output引用cout(即cout的別名)。顯然,插入符函數(shù)的第2個參數(shù)使用引用方式比直接使用對象名的可讀性要好一些
類運算符和友元運算符的區(qū)別
如果運算符所需的操作數(shù)(尤其是第一個操作數(shù))希望進(jìn)行隱式類型轉(zhuǎn)換,則運算符應(yīng)通過友元來重載。另一方面,如果一個運算符的操作需要修改類對象的狀態(tài),則應(yīng)當(dāng)使用類運算符,這樣更符合數(shù)據(jù)封裝的要求。但參數(shù)是引用還是對象,則要根據(jù)運算符在使用中可能出現(xiàn)的情況來決定。 ?如果對象作為重載運算符函數(shù)的參數(shù),則可以使用構(gòu)造函數(shù)將常量轉(zhuǎn)換成該類型的對象。如果使用引用作為參數(shù),因為這些常量不能作為對象名使用,所以編譯系統(tǒng)就要報錯。
轉(zhuǎn)載于:https://www.cnblogs.com/aeolian/p/7690484.html
總結(jié)
以上是生活随笔為你收集整理的C++运算符重载(10)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用FormData进行Ajax请求异步
- 下一篇: 响应式设计的真正挑战:RSS