從C過渡到C++的幾個知識點(結構體、引用、重載運算符)


一、結構體和類(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;則錯,因為只能引用一次。

聲明ba的引用 ,即ba的別名。在聲明一個引用類型變量時,必須同時使之初始化即聲明它代表哪個變量。在聲明變量 是變量 的引用后,在它們所在函數執行期間,該引用類型變量 始終與變量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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM