一、結構體和類(class)
下面一個使用結構體類型的例子
1 #include <iostream> 2 using namespace std; 3 struct Point{ // 聲明Point結構體類型 4 double x; // 成員變量,沒有使用private和public時系統默認為公有類型成員變量 5 double y; 6 }; 7 int main() 8 { 9 Point p; // 定義的p在c里稱為結構體變量 10 p.x = 3.2; // 因為x是公有類型可以通過結構體變量直接引用使用 11 p.y = 8.9; 12 cout << "(" << p.x << "," << p.y << ")" << endl; // 結構體的使用 13 return 0; 14 }
類是面向對象語言的重要特征,下面是一個使用類的例子
1 #include <iostream> 2 using namespace std; 3 class Point // 類 5 {private: //私有數據成員不能在類外普通函數中直接引用使用 6 double x; // 私有成員變量 7 double y; // 私有成員變量 8 public: //公有數據成員或成員函數可以在類外普通函數中直接引用使用,結構體中默認所有成員都是公有的。 9 setPoint(double m, double n) // 公有成員函數 10 { x = m; y = n; // 私有成員變量x y 在同為成員的函數中出現 11 } // 並且此時不需要"."作為成員連接符 因為x y 和函數setPoint 都在Point類“內部” 12 printPoint() // 公有成員函數 13 { cout << "(" << x << "," << y << ")" << endl; } // 同上 14 }; 15 //如果類外定義printPoint(),則函數開頭為: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直接引用使用,而是直接供成員函數使用 21 p.printPoint(); 22 return 0; 23 }//上面類的使用方法同樣適用於c++里的結構體
c++里擴展了結構體的功能,使結構體也具有類的幾乎所有特點,如可以包含成員函數,構造函數等等。類與結構體的區別在於:在默認狀態下(即在不聲明private和public時),結構的所有成員均是公有的,而類的所有成員是私有的,公有的可以在其它函數中直接調用成員變量。
在c++里之所以要保留struct,是為了與C兼容,讓c程序可以不加修改地在c++環境下使用。
因為我們學習的算法可以只使用結構體就可以了,所以可以在參考書中當成類來看,但是類的繼承派生等沒有用在我們目前學習的算法里。
二、this指針
它是指向本類對象(或體結構體變量)的指針,它的值是當前被調用的成員函數所在的對象的起始地址。*this就是this所指向的結構體變量。return *this //返回當前結構體變量值
三、引用和指針
int a,c;
int &b=a; //類似指針,與指針不同點如int &b=a;&b=c;則錯,因為只能引用一次。
聲明b是a的引用 ,即b是a的別名。在聲明一個引用類型變量時,必須同時使之初始化即聲明它代表哪個變量。在聲明變量 b 是變量 a 的引用后,在它們所在函數執行期間,該引用類型變量 b 始終與變量a相聯系,不能再做為其它變量的引用。常用在函數形參中,常在形參前面加const表示在該函數體內不能修改。
四、運算符重載實際上是函數的重載
C++中預定義的運算符(如>>,+,<,)的操作對象只能是基本數據類型(如:int,float),實際上,對於很多用戶自定義類型(如:結構體)要進行類似的運算操作時需要重載(=和&有時可不重載)。
運算符重載的格式如下:
函數類型 operator 運算符名稱(形參表列){對運算符的重載處理}
賦值等運算符必須定義為類(或結構體,本文提到的類與結構體等同,對象與結構體變量等同)的成員函數(即放在類里),<<和>>不能定義為類的成員函數(即需放在類外)。
對“<<”和“>>”重載的函數形式如下:
//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);//聲明運算符的"+"函數 8 void display(); 9 }; 10 Complex Complex::operator+(Complex &c2) //在結構體外定義結構體的成員函數用:: 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) //重載>>運算符用於輸入數據,因結構體里變量是公有成員,不用聲明為友元函數,可直接引用成員 22 {input>>c.real>>c.imag; return input;} 23 24 ostream & operator <<(ostream & output,Complex &c) //重載<<運算符用於輸出數據 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 }