日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第九天2017/04/18(1、友元函数、运算符重载)

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第九天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);//相當于成員函數中的*this

2、友元函數

//詳細講解: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++中不能用友元函數重載的運算符有: = ( ) [ ] ->

#include <iostream> using namespace std; class Complex { public: //構造函數:寫成下面三個,看起來啰嗦,其實是為了防止調用時發生二義性Complex(){real=0; imag=0;} Complex(double r,double i) {real=r;imag=i;}Complex(double r){real=r;imag=0;} //轉換構造函數/*-------------------------------------------------------------------*/ //重載 + //case1:重載運算符函數為成員函數(左操作數由this指針傳遞,右操作數由參數傳遞)Complex operator-(Complex & obj) //返回類型Complex {Complex tmp;tmp.real = real+obj.real;tmp.imag = imag+obj.imag;return tmp;} //case2:重載運算符函數為友元函數(左、右操作數由參數傳遞)friend Complex operator+(const Complex& c1,const Complex& c2) //返回類型Complex{return Complex(c1.real+c2.real, c1.imag+c2.imag); } /*-------------------------------------------------------------------*/ //重載前置++、--Complex& operator--() //成員函數{return Complex(--real,--imag); // 返回類型都是引用Complex&}friend Complex& operator++(Complex& obj) //友元函數{return Complex(++obj.real,++obj.imag); //形參和返回類型都是引用Complex&} //重載后置++、--Complex operator++(int) //成員函數{Complex tmp = *this;this->real++;this->imag++;return tmp;}friend Complex operator--(Complex& obj,int) //友元函數{Complex tmp = obj;obj.real--;obj.imag--;return tmp;} /*-------------------------------------------------------------------*/ //重載 <<friend ostream& operator<<(ostream& out,Complex& obj) {out<<"real="<<obj.real<<","<<"imag="<<obj.imag;return out;}//friend void operator<<(ostream& out,Complex& obj) //這樣不能連續輸出//{// out<<"real="<<obj.real<<","<<"imag="<<obj.imag;//} //【疑問】為什么返回值是ostream& ,而不是void?//【答】為了能夠連續的輸出; || 注:函數返回值當作左值,則必須返回一個引用! /*-------------------------------------------------------------------*/ private:double real;double imag; };int main() {Complex c1(3,4),c2(5),c3;c3 = c1 + c2;//cout<<c1;//等價于operator<<(cout,c1);,調用完成后,返回值為cout,可以作為左值繼續輸出!cout<<c1<<endl; //等價于operator<<(operator<<(cout,c1),c1);cout<<c2<<endl;cout<<c3<<endl;c3 = 20 + c3; //這種情況必須用友元函數cout<<c3<<endl;c3--;cout<<c3<<endl; } 【總結規律】//【返回類型:對象Complex、String】 ① + - * / % += -= *= /= %= 基本的四則運算friend String operator+(const String& s1,const String& s2);String operator+(const String& s); friend String operator+(const String& s,const char* str);String operator+(const char* s); friend String operator+=(String& s1, const String& s2); String operator+=(const String& s);friend String operator+=(String& s,const char* str);String operator+=(const char* str); ②單目運算符:后置++、后置--Complex operator++(int); friend Complex operator--(Complex& obj,int); ------------------------------------------------------------------------ //【返回類型:對象的引用Complex&、String&】 Complex& operator--();//前置++、前置-- ①連續操作:>> 、 << 、 賦值=friend ostream& operator<<(ostream& out,Complex& obj);Complex& operator=(const Complex& obj); ②返回值作為“左值”char& operator[](int i); // []操作符======================================================================================== 【綜合示例】 //String類 //------------------------------------------------------------------- //重載 = :返回的是String&,“連等a=b=c”String& operator=(char *s);String& operator=(const String& s); //------------------------------------------------------------------- //重載 + :返回的是String (s=s1+s2;因為如果用String&,會使在執行完+后,s1的值也發生變化)//friend String operator+(const String& s1,const String& s2);String operator+(const String& s); //friend String operator+(const String& s,const char* str);String operator+(const char* s); //重載 += :返回的是String//friend String operator+=(String& s1, const String& s2); String operator+=(const String& s);//friend String operator+=(String& s,const char* str);String operator+=(const char* str); //------------------------------------------------------------------- //重載 [] :返回的是char&char& operator[](int i);const char& operator[](int i) const; //重載 << >> :返回的是ostream&friend ostream& operator<<(ostream &out,String &s);friend istream& operator>>(istream &in ,String &s); //------------------------------------------------------------------- //friend函數:重載> < == != friend bool operator<(const String& s1,const String& s2);friend bool operator>(const String& s1,const String& s2);friend bool operator==(const String& s1,const String& s2);friend bool operator!=(const String& s1,const String& s2);

總結

以上是生活随笔為你收集整理的第九天2017/04/18(1、友元函数、运算符重载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。