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 只在其被聲明的語句塊內有效(一個語句塊指在一對花括號{}內的一組指令)。