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 }

原文链接: https://www.cnblogs.com/waynelu/archive/2012/07/05/2577138.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/54450

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午5:37
下一篇 2023年2月9日 上午5:38

相关推荐