從C過渡到C++的幾個知識點(結(jié)構(gòu)體、引用、重載運算符)
一、結(jié)構(gòu)體和類(class)
下面一個使用結(jié)構(gòu)體類型的例子
1 #include <iostream> 2 using namespace std; 3 struct Point{ // 聲明Point結(jié)構(gòu)體類型 4 double x; // 成員變量,沒有使用private和public時系統(tǒng)默認(rèn)為公有類型成員變量 5 double y; 6 }; 7 int main() 8 { 9 Point p; // 定義的p在c里稱為結(jié)構(gòu)體變量 10 p.x = 3.2; // 因為x是公有類型可以通過結(jié)構(gòu)體變量直接引用使用 11 p.y = 8.9; 12 cout << "(" << p.x << "," << p.y << ")" << endl; // 結(jié)構(gòu)體的使用 13 return 0; 14 }
類是面向?qū)ο笳Z言的重要特征,下面是一個使用類的例子
1 #include <iostream> 2 using namespace std; 3 class Point // 類 5 {private: //私有數(shù)據(jù)成員不能在類外普通函數(shù)中直接引用使用 6 double x; // 私有成員變量 7 double y; // 私有成員變量 8 public: //公有數(shù)據(jù)成員或成員函數(shù)可以在類外普通函數(shù)中直接引用使用,結(jié)構(gòu)體中默認(rèn)所有成員都是公有的。 9 setPoint(double m, double n) // 公有成員函數(shù) 10 { x = m; y = n; // 私有成員變量x y 在同為成員的函數(shù)中出現(xiàn) 11 } // 并且此時不需要"."作為成員連接符 因為x y 和函數(shù)setPoint 都在Point類“內(nèi)部” 12 printPoint() // 公有成員函數(shù) 13 { cout << "(" << x << "," << y << ")" << endl; } // 同上 14 }; 15 //如果類外定義printPoint(),則函數(shù)開頭為:void Point::printPoint() 16 int main() 17 { 18 Point p; //定義的p在c++里稱為對象 19 p.setPoint(3.2, 8.9); 20 // 因為x是在類里聲明為privete私有類型,在這里x不能像p.x直接引用使用,而是直接供成員函數(shù)使用 21 p.printPoint(); 22 return 0; 23 }//上面類的使用方法同樣適用于c++里的結(jié)構(gòu)體
c++里擴(kuò)展了結(jié)構(gòu)體的功能,使結(jié)構(gòu)體也具有類的幾乎所有特點,如可以包含成員函數(shù),構(gòu)造函數(shù)等等。類與結(jié)構(gòu)體的區(qū)別在于:在默認(rèn)狀態(tài)下(即在不聲明private和public時),結(jié)構(gòu)的所有成員均是公有的,而類的所有成員是私有的,公有的可以在其它函數(shù)中直接調(diào)用成員變量。
在c++里之所以要保留struct,是為了與C兼容,讓c程序可以不加修改地在c++環(huán)境下使用。
因為我們學(xué)習(xí)的算法可以只使用結(jié)構(gòu)體就可以了,所以可以在參考書中當(dāng)成類來看,但是類的繼承派生等沒有用在我們目前學(xué)習(xí)的算法里。
二、this指針
它是指向本類對象(或體結(jié)構(gòu)體變量)的指針,它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對象的起始地址。*this就是this所指向的結(jié)構(gòu)體變量。return *this //返回當(dāng)前結(jié)構(gòu)體變量值
三、引用和指針
int a,c;
int &b=a; //類似指針,與指針不同點如int &b=a;&b=c;則錯,因為只能引用一次。
聲明b是a的引用 ,即b是a的別名。在聲明一個引用類型變量時,必須同時使之初始化即聲明它代表哪個變量。在聲明變量 b 是變量 a 的引用后,在它們所在函數(shù)執(zhí)行期間,該引用類型變量 b 始終與變量a相聯(lián)系,不能再做為其它變量的引用。常用在函數(shù)形參中,常在形參前面加const表示在該函數(shù)體內(nèi)不能修改。
四、運算符重載實際上是函數(shù)的重載
C++中預(yù)定義的運算符(如>>,+,<,)的操作對象只能是基本數(shù)據(jù)類型(如:int,float),實際上,對于很多用戶自定義類型(如:結(jié)構(gòu)體)要進(jìn)行類似的運算操作時需要重載(=和&有時可不重載)。
運算符重載的格式如下:
函數(shù)類型 operator 運算符名稱(形參表列){對運算符的重載處理}
賦值等運算符必須定義為類(或結(jié)構(gòu)體,本文提到的類與結(jié)構(gòu)體等同,對象與結(jié)構(gòu)體變量等同)的成員函數(shù)(即放在類里),<<和>>不能定義為類的成員函數(shù)(即需放在類外)。
對“<<”和“>>”重載的函數(shù)形式如下:
//cin和cout分別是istream和ostream類的對象 istream & operator >> (istream &,自定義類 &) ostream & operator << (ostream &,自定義類 &)
下面例子重載+、>>和<<運算符
1 #include<iostream> 2 using namespace std; 3 struct Complex 4 { 5 double real,imag; 6 Complex(double r=0,double i=0) { real=r; imag=i; } 7 Complex operator + (Complex &c2);//聲明運算符的"+"函數(shù) 8 void display(); 9 }; 10 Complex Complex::operator+(Complex &c2) //在結(jié)構(gòu)體外定義結(jié)構(gòu)體的成員函數(shù)用:: 11 { 12 Complex c; 13 c.real=real+c2.real; 14 c.imag=imag+c2.imag; 15 return c; 16 } 17 18 void Complex::display() 19 { cout<<"("<<real<<","<<imag<<"i)"<<endl;} 20 21 istream & operator >>(istream & input,Complex &c) //重載>>運算符用于輸入數(shù)據(jù),因結(jié)構(gòu)體里變量是公有成員,不用聲明為友元函數(shù),可直接引用成員 22 {input>>c.real>>c.imag; return input;} 23 24 ostream & operator <<(ostream & output,Complex &c) //重載<<運算符用于輸出數(shù)據(jù) 26 {output<<"("<<c.real<<"+"<<c.imag<<"i)"; return output;} 27 28 int main() 29 { 30 Complex c1(3,4),c2(5,-10),c3; 31 c3=c1+c2; 32 cout<<"c1="; 33 c1.display(); 34 cout<<"c2="; 35 c2.display(); 36 cout<<c3; //和 c3.display();等價 37 return 0; 38 }
浙公網(wǎng)安備 33010602011771號