C++ Primer Plus(十一)—— 使用类
為什么80%的碼農都做不了架構師?>>> ??
不要返回指向局部變量或臨時對象的引用,函數執行完畢后,局部變量和臨時對象都將消失,引用將指向不存在的數據。
C++對用戶定義的運算符重載的限制:
重載的運算符不必是成員函數,但必須至少有一個操作數是用戶定義的類型。
使用運算符時不能違反運算符原來的句法規則,不能修改運算符的優先級。
不能創建新的運算符。
不能重載以下的運算符:【sizeof,.,.*,::,?:,typeid,const_casr,dynamic_cast,reinterpret_cast,static_cast】
以下的運算符只能通過成員函數進行重載:【=,( ),[ ],->】
如果要為類重載運算符,并將非類的第一項作為其第一個操作數,則可以用友元函數來反轉操作數順序。
只有類聲明可以決定哪一個函數是友元,因此類聲明仍然控制了哪些函數可以訪問私有數據;通過使用友元函數和類方法,可以用同一個用戶接口表達這兩種操作,類方法和友元只是表達類接口的兩種不同機制。
友元要將關鍵在friend放在原型聲明前,但不要在定義中使用關鍵字friend。
雖然友元函數是在類聲明中聲明的,但它不是成員函數,一次不能用成員運算符來調用。
雖然友元函數不是成員函數,但它與成員函數的訪問權限相同。
假設有構造函數Stone(double),如果在類構造函數聲明中使用了關鍵字explicit,則該構造函數只能用于顯式強制轉換,否則還可以用于下面的隱式轉換:
將對象初始為double值時
將double值賦給Stone對象時
將double值傳遞給接受Stone參數的函數時
返回值被聲明為Stone的函數試圖返回double值時
在上述任意一種情況下,使用可轉換為double類型的內置類型時
被稱為轉換函數的特殊類成員運算符函數,用于將類對象轉換為其他類型,它沒有返回類型、沒有參數,名為operator typeName( ),其中typeName是對象將被轉換成的類型,將類對象賦值給typeName變量或將其強制轉換為typeName類型時,該轉換函數將自動調用。
提供執行自動、隱式轉換的函數所存在的問題是:在用戶不希望進行轉換的時候,轉換函數也有可能進行轉換。應謹慎的使用隱式轉換函數,最好選擇僅在顯式的調用時才會被執行的函數。在C++98中,關鍵字explicit不能用于轉換函數,但C++11消除了這種限制。
轉載于:https://my.oschina.net/shou1156226/blog/608162
總結
以上是生活随笔為你收集整理的C++ Primer Plus(十一)—— 使用类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis集群方案,Codis安装测试
- 下一篇: 差分约束 4416 FFF 团卧底的后