C++ 掃盲學習

1.繼承:

C++ 的繼承用冒號“:”,

如class A:public B

其中B前面的public是訪問權限的一個標誌,

共有三個最低權限級別:private  protected  public

class A:private B //從B中繼承來的成員變量和方法的屬性全部變成private
class A:protected B //從B中繼承來的所有public方法的屬性變成protected
class A:public B //從B中繼承來的成員變量和方法保持原有屬性

實現多重繼承時,基類間用“,”號隔開

class CRectangle: public CPolygon, public COutput {

不能被繼承的:1.構造函數和析構函數 2.純虛擬函數 3.友善關係

雖然基類的構造函數和析構函數沒有被繼承,但是當一個子類的object被生成或銷燬的時候,

其基類的默認構造函數 (即,沒有任何參數的構造函數)和析構函數總是被自動調用的。

如果基類沒有默認構造函數,或你希望當子類生成新的object時,基類的某個重載的構造函數被調用,

你需要在子類的每一個構造函數的定義中指定它:
derived_class_name (parameters) : base_class_name (parameters) {}

2.類中方法可以在類中聲明,在類外定義,使用雙冒號進行聲明:
範圍操作符 (::) 聲明瞭被定義的成員所屬的class名稱,並賦予被定義成員適當的範圍屬性,這些範圍屬性與在class內部定義成員的屬性是一樣的。

例如,在下面的例子中,我們在函數set_values() 中引用了private變量x 和 y,這些變量只有在class內部和它的成員中才是可見的。

在class內部直接定義完整的函數,和只定義函數的原型而把具體實現放在class外部的唯一區別在於,在第一種情況中,

編譯器(compiler) 會自動將函數作爲inline 考慮,而在第二種情況下,函數只是一般的class成員函數:

  #include <iostream.h>

 class CRectangle {
	int width, height;
  public:
	void set_values (int, int);
	int area (void) {return (width * height);}
	friend CRectangle duplicate (CRectangle);
  };

 void CRectangle::set_values (int a, int b) {
	width = a;
	height = b;
     }

 CRectangle duplicate (CRectangle rectparam) {
	CRectangle rectres;
	rectres.width = rectparam.width*2;
	rectres.height = rectparam.height*2;
	return (rectres);
      }

 int main () {
	CRectangle rect, rectb;
	rect.set_values (2,3);
	rectb = duplicate (rect);
	cout << rectb.area();
      }


 

3.友善類和友善函數:
 在類中聲明一個函數和一個類爲友善的,可使友善函數和類訪問類中的private和protected屬性的成員變   量和方法。

友善類聲明:friend class CRectangle;

 友善函數聲明:friend CRectangle duplicate (CRectangle);

4.抽象類和虛擬函數
  虛擬函數:在函數的前面 加關鍵字virtual:
          virtual int area (void) { return (0); }

 純虛擬函數:在函數名前面加關鍵字virtual,不用定義,直接後面加=0;
        virtual int area (void) =0;

  包含純虛擬函數的爲抽象類,不能直接實例化對象。
  可以用指向基類的指針實現向上轉型,指向基類的指針只能調用在基類中定義過的的函數,
  可以在基類中加虛擬或純虛擬函數,在子類中重寫,用指向基類的指針調用方法,
  可調用相應子類的重寫的方法,實現多態特性。

5.模板

  模板按其字面意思是定義好一個模子,參數爲泛類型,不收參數類型的限制,如我定義一個函數,

  傳入int可以,傳入long也可以,定義的時候有一定的格式要求,

  函數模板:

  template <class T> T GetMax (T a, T b) {
           return (a>b?a:b);
        }

   int main () {
          int i=5, j=6, k;
          long l=10, m=5, n;
          k=GetMax(i,j);
          n=GetMax(l,m);
         cout << k << endl;
         cout << n << endl;
         return 0;
        }

類模板:

   template <class T> class pair {
      T value1, value2;
      public:
	pair (T first, T second) {
        value1=first;
        value2=second;
    }
    T getmax ();
   };

   template <class T> T pair::getmax (){
    T retval;
    retval = value1>value2? value1 : value2;
    return retval;
    }

  int main () {
    pair  myobject (100, 75);
    cout << myobject.getmax();
    return 0;
   }

  當然也有模板的特殊化,即可指定特定的數據類型:
  template <> class pair <int> {。。。}

6. 命名空間就是把全局範圍分割成許多子域範圍,一個子域範圍用一個名字來表示:

 #include <iostream.h>

namespace first {
    int var = 5;
}

namespace second {
    double var = 3.1416;
}

int main () {
    cout << first::var << endl;
    cout << second::var << endl;
    return 0;
}

上面的調用相應空間中的成員變量都使用範圍操作符::,

當然還有另外一種的方式即using namespace:

 #include <iostream.h>

namespace first {
    int var = 5;
}

namespace second {
    double var = 3.1416;
}

int main () {
    using namespace second;
    cout << var << endl;
    cout << (var*2) << endl;
    return 0;
}

這裏要注意,語句using namespace 只在其被聲明的語句塊內有效(一個語句塊指在一對花括號{}內的一組指令)。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章