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 只在其被声明的语句块内有效(一个语句块指在一对花括号{}内的一组指令)。