不要返回指向局部變量或臨時對象的引用,函數執行完畢後,局部變量和臨時對象都將消失,引用將指向不存在的數據。函數
C++對用戶定義的運算符重載的限制:spa
重載的運算符沒必要是成員函數,但必須至少有一個操做數是用戶定義的類型。對象
使用運算符時不能違反運算符原來的句法規則,不能修改運算符的優先級。接口
不能建立新的運算符。ci
不能重載如下的運算符:【sizeof,.,.*,::,?:,typeid,const_casr,dynamic_cast,reinterpret_cast,static_cast】原型
如下的運算符只能經過成員函數進行重載:【=,( ),[ ],->】it
若是要爲類重載運算符,並將非類的第一項做爲其第一個操做數,則能夠用友元函數來反轉操做數順序。ast
只有類聲明能夠決定哪個函數是友元,所以類聲明仍然控制了哪些函數能夠訪問私有數據;經過使用友元函數和類方法,能夠用同一個用戶接口表達這兩種操做,類方法和友元只是表達類接口的兩種不一樣機制。變量
友元要將關鍵在friend放在原型聲明前,但不要在定義中使用關鍵字friend。權限
雖然友元函數是在類聲明中聲明的,但它不是成員函數,一次不能用成員運算符來調用。
雖然友元函數不是成員函數,但它與成員函數的訪問權限相同。
假設有構造函數Stone(double),若是在類構造函數聲明中使用了關鍵字explicit,則該構造函數只能用於顯式強制轉換,不然還能夠用於下面的隱式轉換:
將對象初始爲double值時
將double值賦給Stone對象時
將double值傳遞給接受Stone參數的函數時
返回值被聲明爲Stone的函數試圖返回double值時
在上述任意一種狀況下,使用可轉換爲double類型的內置類型時
被稱爲轉換函數的特殊類成員運算符函數,用於將類對象轉換爲其餘類型,它沒有返回類型、沒有參數,名爲operator typeName( ),其中typeName是對象將被轉換成的類型,將類對象賦值給typeName變量或將其強制轉換爲typeName類型時,該轉換函數將自動調用。
提供執行自動、隱式轉換的函數所存在的問題是:在用戶不但願進行轉換的時候,轉換函數也有可能進行轉換。應謹慎的使用隱式轉換函數,最好選擇僅在顯式的調用時纔會被執行的函數。在C++98中,關鍵字explicit不能用於轉換函數,但C++11消除了這種限制。