zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/h-hg/p/8784432.html
Copyright © 2011-2022 走看看