一、
∷”是作用域限定符(field qualifier)或称作用域运算符,用它声明函数是属于哪个类的。如果在作用域运算符“∷”的前面没有类名,或者函数名前面既无类名又无作用域运算符“∷”
,比如如∷display( )或display( )则表示display函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。
二、
参数初始化表来实现对数据成员的初始化
Box∷Box(int h,int w,int len):height(h),width(w),length(len){ }
结果为height = h;width = w; length = len;
三、
构造函数和析构函数的执行顺序:
四、 类模版(template)):
有时,有两个或多个类,其功能是相同的,仅仅是数据类型不一样,这时候就需要类模版
类模版的范例如下:
template<class numtype> //声明一个模板,虚拟类型名为numtype
class Compare //类模板名为Compare
{
public:
Compare(numtype a,numtype b)
{
x=a;
y=b;
}
numtype max( )
{
return (x>y)?x:y;
}
numtype min( )
{
return (x<y)?x:y;
}
private:
numtype x,y;
};
从上面可以看出:
声明类模板时要增加一行 template <class 类型参数名>原有的类型名int换成虚拟类型参数名numtype。在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype。如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。
在声明了一个类模板后,怎么使用它?怎样使它变成一个实际的类?
先回顾一下用类来定义对象的方法:
Compare_int cmp1(4,7); //Compare_int是已经声明的类
用类模板定义对象的方法与此相似,但是不能直接写成Compare cmp(4,7); // Compare是类模板名
Compare是类模板名,而不是一个具体的类,类模板体中的类型numtype并不是一个实际的类型,只是一个虚拟的类型,无法用它来定义对象。必须用实际类型名去取代虚拟的类型,具体的做法是:
Compare <int> cmp(4,7);
即在类模板名之后再尖括号内指定实际的类型名,在进行编译的时候,编译系统就用int取代类模版中的类型参数numtype。
归纳总结:
我们可以这样声明和使用类模板;
五、多重继承
允许一个派生类同时继承多个基类。这种行为称为多重继承(multiple inheritance)。