• 静态数据成员与静态成员函数


    一、静态数据成员的实现

           静态数据成员在.h中声明变量,只能在.cpp文件中给这个静态变量赋初值。赋值的时候不能加上static, 但需要加上类名,表明这个静态数据成员属于哪一个类。

        例如:

             .h文件

        public:

         static float m_fArea;            //静态数据成员变量

        .cpp

         float RectangleImp1::m_fArea = 0;         //正确

         static float RectangleImp1::m_fArea = 0;    //错误

         static float  m_fArea = 0;              //错误

         float  RectangleImp1::m_fArea = 0;        //错误

    二、静态成员函数的是实现

           静态成员函数在.h中声明变量,在.cpp文件或者也可以在.h文件中定义这个静态成员函数赋。定义的时候不能加上static, 但需要加上类名,表明这个静态成员函数属于哪一个类。
          例如:

        .h文件

        public:

                 static IRectangle *  CreateRectangle();

        .h文件或者.cpp文件

         IRectangle * IRectangle::CreateRectangle()      //正确
         {
             IRectangle * pIRectangle = new RectangleImp1;
        
             return pIRectangle;
         }

         static IRectangle * IRectangle::CreateRectangle()   //错误
         {
         }

         static IRectangle * CreateRectangle()          //错误
         {
         }

         IRectangle * IRectangle::CreateRectangle()      //错误
         {
         }

       2.1 在.h中声明,在.cpp中定义

    #ifndef _RECTANGLE_H_
    #define _RECTANGLE_H_
    
    #include <iostream>
    using namespace std;
    
    //抽象接口类
    class IRectangle
    {
    public:
    
        virtual ~IRectangle()
        {}
        virtual float GetWidth() = 0;
        virtual float GetHigh() = 0;
        virtual void Draw() = 0;
        static IRectangle *  CreateRectangle();
    };
    
    
    //矩形类
    class RectangleImp1:public IRectangle
    {
        
    private:
        float m_fHigh;
        float m_fWidth;
    public:
        RectangleImp1():m_fHigh(3),m_fWidth(2)
        {
    
        }
        virtual ~RectangleImp1()
        {
            
        }
    
        virtual float GetWidth();
        virtual float GetHigh();
        virtual void Draw();
    };
    #endif
    #include <iostream>
    #include "Rectangle.h"
    using namespace std;
    
    //静态成员函数
    IRectangle * IRectangle::CreateRectangle()
    {
        IRectangle * pIRectangle = new RectangleImp1;
        
        return pIRectangle;
    }
    
    
    float RectangleImp1::GetWidth()
    {
        return m_fWidth;
    }
    
    float  RectangleImp1::GetHigh()
    {
        return m_fHigh;
    }
    
    void RectangleImp1::Draw()
    {
        cout << "我是矩形" << endl;
    }

       2.2 在.h中声明,也在.h中定义

     1 #ifndef _RECTANGLE_H_
     2 #define _RECTANGLE_H_
     3 
     4 #include <iostream>
     5 using namespace std;
     6 
     7 //抽象接口类
     8 class IRectangle
     9 {
    10 public:
    11 
    12     virtual ~IRectangle()
    13     {}
    14     virtual float GetWidth() = 0;
    15     virtual float GetHigh() = 0;
    16     virtual void Draw() = 0;
    17     static IRectangle *  CreateRectangle();
    18 };
    19 
    20 
    21 //矩形类
    22 class RectangleImp1:public IRectangle
    23 {
    24     
    25 private:
    26     float m_fHigh;
    27     float m_fWidth;
    28 public:
    29     RectangleImp1():m_fHigh(3),m_fWidth(2)
    30     {
    31 
    32     }
    33     virtual ~RectangleImp1()
    34     {
    35         
    36     }
    37 
    38     virtual float GetWidth();
    39     virtual float GetHigh();
    40     virtual void Draw();
    41 };
    42 
    43 //静态成员函数
    44 IRectangle * IRectangle::CreateRectangle()
    45 {
    46     IRectangle * pIRectangle = new RectangleImp1;
    47     
    48     return pIRectangle;
    49 }
    50 
    51 
    52 float RectangleImp1::GetWidth()
    53 {
    54     return m_fWidth;
    55 }
    56 
    57 float  RectangleImp1::GetHigh()
    58 {
    59     return m_fHigh;
    60 }
    61 
    62 void RectangleImp1::Draw()
    63 {
    64     cout << "我是矩形" << endl;
    65 }
    66 
    67 #endif

    三、.h文件中既声明了静态数据成员,又声明了静态成员函数。

        .h文件中既声明了静态数据成员,又声明了静态成员函数。则只能在.h中做声明, 在.cpp文件中做定义

    #ifndef _RECTANGLE_H_
    #define _RECTANGLE_H_
    
    #include <iostream>
    using namespace std;
    
    //抽象接口类
    class IRectangle
    {
    public:
    
        virtual ~IRectangle()
        {}
        virtual float GetWidth() = 0;
        virtual float GetHigh() = 0;
        virtual void Draw() = 0;
        static IRectangle *  CreateRectangle();
        virtual float GetArea() = 0;
    };
    
    
    //矩形类
    class RectangleImp1:public IRectangle
    {
        
    private:
        float m_fHigh;
        float m_fWidth;
    public:
        static float m_Area;
    
        RectangleImp1():m_fHigh(3),m_fWidth(2)
        {
    
        }
        virtual ~RectangleImp1()
        {
            
        }
    
        virtual float GetWidth();
        virtual float GetHigh();
        virtual void Draw();
        virtual float GetArea();
    };
    #endif
    #include <iostream>
    #include "Rectangle.h"
    using namespace std;
    
    //静态数据成员初始化
    float RectangleImp1::m_Area = 0;
    
    //静态成员函数
    IRectangle * IRectangle::CreateRectangle()
    {
        IRectangle * pIRectangle = new RectangleImp1;
        
        return pIRectangle;
    }
    
    
    float RectangleImp1::GetWidth()
    {
        return m_fWidth;
    }
    
    float  RectangleImp1::GetHigh()
    {
        return m_fHigh;
    }
    
    void RectangleImp1::Draw()
    {
        cout << "我是矩形" << endl;
    }
    
    float RectangleImp1::GetArea()
    {
        m_Area = m_fHigh * m_fWidth;
        
        return m_Area;
    }
  • 相关阅读:
    一文详解ORB-SLAM3
    模块、进程、线程回调函数的逆向
    EPT的开启与处理
    VT MSR、CR、 Exception、#PF
    VT MTF VM-Exit
    VT技术对于除零异常的拦截与派发到3号中断
    异常与中断
    KVM_SET_SREGS 64位设置错误
    SQL注入实验学习笔记
    Pwn之简单patch
  • 原文地址:https://www.cnblogs.com/xydblog/p/3502951.html
Copyright © 2020-2023  润新知