当前位置: 网站首页>小程序开发>网站开发

灯塔企业网站设计 - 灯塔高端网站定制 - 灯塔品牌网站搭建 - 上往建站

发表日期: 2022-07-30 16:15:04 浏览次数:24

灯塔企业网站设计 - 灯塔高端网站定制 - 灯塔品牌网站搭建 - 上往建站

网站建设.png

;      pt.init();      pt.output();  }

编译通过。

结论 2:类的对象可以使用静态成员函数和非静态成员函数。

在类的静态成员函数中使用类的非静态成员。

#include <stdio.h>  class Point  {  public:      void init()      {        }      static void output()      {          printf("%d\n", m_x);      }  private:      int m_x;  };  void main()  {      Point pt;      pt.output();  }

编译出错:

error C2597: illegal reference to data member 'Point::m_x' in a static member function

因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。

结论3:静态成员函数中不能引用非静态成员。

在类的非静态成员函数中使用类的静态成员。

class Point  {  public:      void init()      {            output();      }      static void output()      {      }  };  void main()  {      Point pt;      Pt.init();    pt.output();  }

编译通过。

结论 4:类的非静态成员函数可以调用用静态成员函数,但反之不能。

使用类的静态成员变量。



    static void output()  

    {  

    }  

};  

void main()  

{  

    Point pt;  

    Pt.init();

    pt.output();  

}

编译通过。


结论 4:类的非静态成员函数可以调用用静态成员函数,但反之不能。


使用类的静态成员变量。


#include <stdio.h>  

class Point  

{  

public:   

    Point()  

    {    

        m_nPointCount++;  

    }  

    ~Point()  

    {  

        m_nPointCount--;  

    }  

    static void output()  

    {  

        printf("%d\n", m_nPointCount);  

    }  

private:  

    static int m_nPointCount;  

};  

void main()  

{  

    Point pt;  

    pt.output();  

}

按 Ctrl+F7 编译无错误,按 F7 生成 EXE 程序时报链接错误。


error LNK2001: unresolved external symbol "private: static int Point::m_nPointCount" (?m_nPointCount@Point@@0HA)

这是因为类的静态成员变量在使用前必须先初始化。


在 main() 函数前加上 int Point::m_nPointCount = 0; 再编译链接无错误,运行程序将输出 1。


结论 5:类的静态成员变量必须先初始化再使用。


思考总结:静态资源属于类,但是是独立于类存在的。从 J 类的加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类实例化对象的时候加载的。 类的初始化早于类实例化对象,比如 Class.forName("xxx") 方法,就是初始化了一个类,但是并没有实例化对象,只是加载这个类的静态资源罢 了。所以对于静态资源来说,它是不可能知道一个类中有哪些非静态资源的;但是对于非静态资源来说就不一样了,由于它是实例化对象出来之后产生的,因此属于类的这些东西它都能认识。所以上面的几个问题答案就很明确了:


1)静态方法能不能引用非静态资源?不能,实例化对象的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。

2)静态方法里面能不能引用静态资源?可以,因为都是类初始化的时候加载的,大家相互都认识。

3)非静态方法里面能不能引用静态资源?可以,非静态方法就是实例方法,那是实例化对象之后才产生的,那么属于类的内容它都认识。

(static 修饰类:这个用得相对比前面的用法少多了,static 一般情况下来说是不可以修饰类的, 如果 static 要修饰一个类,说明这个类是一个静态内部类(注意 static 只能修饰一个内部类),也就是匿名内部类。像线程池 ThreadPoolExecutor 中的四种拒绝机制 CallerRunsPolicy、AbortPolicy、DiscardPolicy、 DiscardOldestPolicy 就是静态内部类。静态内部类相关内容会在写内部类的时候专门讲到。)


灯塔企业网站设计 - 灯塔高端网站定制 - 灯塔品牌网站搭建 - 上往建站

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: https://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878