C++要点
1.虚函数,纯虚函数
虚函数用来提供给程序能够通过指向基类的指针,来调用具体派生类的该函数实现,是多态的实现方式
纯虚函数定义方式如下:
1 class A 2 { 3 public: 4 virtual void f() = 0; // 说明f函数为纯虚函数 5 virtual void g(); 6 };
含有纯虚函数的类称为抽象类,virtual f() = 0;
抽象类不能实例化.。它仅仅用来抽象出一层方法描述,不必实现,所以对其实例化没有任何意义。
纯虚函数是一个在基类中说明得虚函数,他在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。实际上,他与一般虚函数成员在书写 格式上的不同就在于后面加了 "=0 "。声明为纯虚函数之后,基类中就不再给出函数的实现部分。纯虚函数得函数体由派生类给出。
2.继承、多继承
多继承的主要问题是要注意二义性的问题,从多个路径继承过来的基类的相同数据成员,为避免二义性,需要定义为虚继承:
1 class Top 2 { 3 public: 4 int a; 5 }; 6 7 class Left : virtual public Top 8 { 9 public: 10 int b; 11 }; 12 13 class Right : virtual public Top 14 { 15 public: 16 int c; 17 }; 18 19 class Bottom : public Left, public Right 20 { 21 public: 22 int d; 23 };
3. C++ static用法
a.静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
1 class Myclass 2 { 3 public: 4 Myclass(int a,int b,int c); 5 void GetSum(); 6 private: 7 int a,b,c; 8 static int Sum;//声明静态数据成员 9 }; 10 11 int Myclass::Sum=0;//定义并初始化静态数据成员
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
b.静态成员函数
静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函 数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如 函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义 上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
1 class Myclass 2 { 3 public: 4 Myclass(int a,int b,int c); 5 static void GetSum();/声明静态成员函数 6 private: 7 int a,b,c; 8 static int Sum;//声明静态数据成员 9 }; 10 int Myclass::Sum=0;//定义并初始化静态数据成员 11 12 Myclass::Myclass(int a,int b,int c) 13 { 14 this->a=a; 15 this->b=b; 16 this->c=c; 17 Sum+=a+b+c; //非静态成员函数可以访问静态数据成员 18 } 19 20 void Myclass::GetSum() //静态成员函数的实现 21 { 22 // cout<<a<<endl; //错误代码,a是非静态数据成员 23 cout<<"Sum="<<Sum<<endl; 24 } 25 26 void main() 27 { 28 Myclass M(1,2,3); 29 M.GetSum(); 30 Myclass N(4,5,6); 31 N.GetSum(); 32 Myclass::GetSum(); 33 }