• C++类中的static


      静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问,而静态成员函数可不建立对象就可以被使用。
      或者说静态函数与一般函数没有太大的区别,只是访问有限制,静态变量跟一般的全局变量的区别就是访问有限制。

    static变量

      static变量不像普通的变量,static变量独立于一切类对象处在。static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化。因为static是所有对象共享的东西嘛,必须要比对象先存在的。

    class test
    {
    private:
    public:
        static int i;
    };
    int test::i = 100;//此句包含了声明和赋值,初始化不受private和protected访问限制,但是若是priivate,下面main函数就无法访问
    int main()
    {
        cout << test::i << endl;
        return 0;
    }
    

      好处:用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间。所以一般类const变量一般改为static const变量,可以节省一些空间。

    C++ 类 的static 非const变量如何避免多重定义

    header.h

    #ifndef HEADER_H_
    #define HEADER_H_
    class test{
    public:
      static bool b;
    };
    #endif
    

    cpp1.cpp

    #include "header.h"
    void f1()
    {
      if(test::b)
      	std::cout << "cpp1" << std::endl;
    }
    

    cpp2.cpp

    #include "header.h"
    void f2()
    {
      if(test::b)
        std::cout << "cpp2" << std::endl;
    }
    

    main.cpp

    void f1();
    void f2();
    int main()
    {
      f1();
      f2();
      return 0;
    }
    

    我的解决方案
    header.h

    #ifndef HEADER_H_
    #define HEADER_H_
    class test{
    public:
      static bool b;
    };
    #endif
    

    header.cpp

    #include "header.h"
    bool test::b = false;
    

    cpp1.cpp

    #include "header.h"
    void f1()
    {
      if(test::b)
      	std::cout << "cpp1" << std::endl;
    }
    

    cpp2.cpp

    #include "header.h"
    void f2()
    {
      if(test::b)
        std::cout << "cpp2" << std::endl;
    }
    

    main.cpp

    void f1();
    void f2();
    int main()
    {
      f1();
      f2();
      return 0;
    }
    

    注:如果既是const又是static,直接在header.h里面赋予初始值即可,无需header.cpp

    static成员函数

      static函数也是类函数,所以在写定义时也要写明属于哪个类。与不同类函数不同的是,它没有传入this指针,正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员。
      静态成员函数不可以同时声明为 virtual、const、volatile函数。

    class test
    {
    public:
        static int i;//此处只是声明变量
        static void f();//声明
    };
    int test::i;//此处是定义,少了此处会链接错误
    void test::f()//定义
    {
        i = 1000;
        cout << i << endl;
    }
    int main()
    {
        //test a;
        test::f();
        return 0;
    }
    
  • 相关阅读:
    纯CSS实现小三角提示信息
    PostGIS+QGIS+GeoServer+OpenLayers实现数据的存储、服务的发布以及地图的显示
    Arcgis for Js之Graphiclayer扩展详解
    Arcgis for JS扩展GraphicLayer实现区域对象的聚类统计与展示
    Arcgis for JS之Cluster聚类分析的实现(基于区域范围的)
    Arcgis for JS之Cluster聚类分析的实现
    Arcgis for Js之featurelayer实现空间查询和属性查询
    RESTful WebService入门
    使用 Spring 3 来创建 RESTful Web Services(转)
    基于Spring设计并实现RESTful Web Services(转)
  • 原文地址:https://www.cnblogs.com/h-hg/p/8784432.html
Copyright © 2020-2023  润新知