第九天2017/04/18(1、友元函数、运算符重载)
生活随笔
收集整理的這篇文章主要介紹了
第九天2017/04/18(1、友元函数、运算符重载)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、成員函數和全局函數(友元函數)轉換的技巧
從類的成員函數轉換為全局函數,只需要加一個this指針; 從全局函數轉換為類的成員函數,需要減去一個左操作數參數。【友元函數、成員函數】唯一的區別:友元函數中沒有this指針,而成員函數中有this————>因此友元函數的參數要比成員函數的參數多一個。 【技巧】友元函數的多出來的參數相當于成員函數中隱藏的this指針指向的對象*this,例如:friend String operator+(const String& s1,const String& s2); //s1的作用String operator+(const String& s); //相當于成員函數中的*thisfriend String operator+(const String& s,const char* str);//s的作用String operator+(const char* str); //相當于成員函數中的*thisfriend String operator+=(String& s1, const String& s2); //s1的作用 String operator+=(const String& s);//相當于成員函數中的*thisfriend String operator+=(String& s,const char* str);//s的作用String operator+=(const char* str);//相當于成員函數中的*this2、友元函數
//詳細講解:operator+函數的返回值是對象?還是對象的引用?以及各自對應的正確寫法! #include <iostream> using namespace std; class Complex { public:Complex(double r=0,double i=0) {real=r;imag=i;} //重載函數作為友元函數 //形式1:錯誤friend Complex& operator+(Complex &c1,Complex &c2) //【此處代碼是錯誤的】返回的是引用Complex& {Complex tmp;tmp.real = c1.real+c2.real;tmp.real = c1.imag+c2.imag;return tmp;//返回一個臨時對象的簡寫:return Complex(c1.real+c2.real, c1.imag+c2.imag);可以修改成:在被調函數中動態給對象分配空間,這樣可以把結果甩出去// Complex *tmp = new Complex;// tmp->real = c1.real+c2.real;// tmp->real = c1.imag+c2.imag;// return *tmp;}//分析形式1為什么錯誤? 答:因為返回值為對象的引用時,返回的內容如果是臨時對象,在函數//執行結束后,臨時對象被析構,因此返回一個無效的值。 //形式2:正確friend Complex operator+(Complex &c1,Complex &c2) //【此處代碼是正確的】返回的是對象Complex{Complex tmp;tmp.real = c1.real+c2.real;tmp.real = c1.imag+c2.imag;return tmp;//返回一個臨時對象的簡寫:return Complex(c1.real+c2.real, c1.imag+c2.imag);}//分析形式2為什么正確? 答:因為返回值為對象時,“調用時operator+(c1,c2);返回的//內容也是臨時對象”,但是返回時會調用拷貝構造函數另外創建一個對象來保存臨時對象tmp的//值,因此盡管在函數執行結束后,臨時對象被析構,但是拷貝構造出來的對象可以返回給主函//數,被主函數中的對象接受。void display(){cout<<"real="<<real<<","<<"imag="<<imag<<endl;} private:double real;double imag; }; int main( ) {Complex c1(3,4),c2(5,1),c3;c3=c1+c2;c1.display();c2.display();c3.display(); }3、運算符重載
注:
不能重載的運算符有 . .* sizeof :: ?:
常用的重載運算符有 [] = ++ – == !=
C++中不能用友元函數重載的運算符有: = ( ) [ ] ->
總結
以上是生活随笔為你收集整理的第九天2017/04/18(1、友元函数、运算符重载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第八天2017/04/17(3、C++的
- 下一篇: 第九天2017/04/18(2、类的继承