【问题标题】:Static class member variable and static variable in c++c++中的静态类成员变量和静态变量
【发布时间】:2015-05-05 21:55:03
【问题描述】:

静态类成员变量和静态变量之间的主要区别是什么? 静态类成员和静态变量都可以从任何类的成员函数中访问。静态类成员和静态变量的具体用途是什么?

【问题讨论】:

  • 一个类的静态类成员可以被另一个类的成员函数访问。同样适用于普通静态变量。什么因素可以区分这两种类型的变量。
  • 静态类成员变量-所有对象和静态变量的一个副本-即使超出范围也不会销毁,它会在程序运行期间保持
  • 所有对象只创建一个静态类成员并共享一个副本

标签: c++


【解决方案1】:

唯一的原因是代码简洁。您不能限制对全局静态变量的访问,例如

static int globalValue=5;

它(至少)在您定义它的源文件中可见。 使用类静态,您可以为您的类提示的用户提供您希望如何访问它或被访问的方式。它只在类范围内可见:

class myGlobalContainer
{
   public:
   static int myInt;
   protected:
   static float myFloat;
   private:
   static bool myBool;
};

myInt 的访问由:

int x=myGlobalContainer::myInt;

public 修饰符提示用户您将此值视为 myGlobalContainer 的一部分并希望他使用它。您不会像使用 globalValue 那样污染全局命名空间。

修饰符protected 和private 表明您不希望“局外人”访问这些值。

protected 和 private static 属性主要用于在类的实例之间共享信息,例如实例计数器:

class myGlobalContainer
{
   public:
     myGlobalContainer() 
     {
       if(counter==0)
         DoSomeSpecialGlobalInit();
       counter++;
     }
     ~myGlobalContainer() 
     {
       counter--;
       if(counter==0)
         DoSomeSpecialGlobalUnInit();
     }
   private:
   static int counter=0;
};

public static 属性通常与const 一起出现。他们大多给用户一个快捷方式。例如:

COLOR white=COLOR::WHITE;

代替:

COLOR white=COLOR::FromAGBR(255,255,255,255);

添加最少: 是否应该使用静态是complete other discussion。

【讨论】:

    【解决方案2】:

    静态类成员和静态变量都从成员访问 任何类的函数。

    这不是真的:

    class A {
    private:
        static int x;
    };
    int A::x = 5;
    
    class B {
        static int y;
    public:
        void do_something()
        {
            std::cout << A::x; // Can't access A::x because it's private
        }
    };
    int B::y = 10;
    

    但是,如果我们这样做:

    static int J = 9;
    
    class A {
    private:
        static int x;
    };
    int A::x = 5;
    
    class B {
        static int y;
    public:
        void do_something()
        {
            std::cout << J; // Yes, J is global.
        }
    };
    int B::y = 10;
    
    • 静态成员变量可以访问其类的私有部分,这与普通静态变量相反。
    • 静态成员变量不能在类体内定义,除非它是 const static 或 constexpr static。
    • 静态成员变量可用作其类中成员函数的默认参数。与普通静态变量相反,除非它们是全局变量。

    用途:如果您希望一个变量在这两种情况下都处于活动状态,直到程序结束,但静态成员变量可以访问该类的私有部分。

    【讨论】:

    • 正确。但是公共静态类成员可以被任何其他类的成员函数访问。
    【解决方案3】:

    我们可以使用 static 关键字定义类成员静态。当我们将一个类的成员声明为静态时,这意味着无论创建多少类对象,静态成员都只有一个副本。

    如果你声明一个静态成员public,那么你也可以在没有成员函数的情况下访问它。静态与变量的范围无关。它只指定存储持续时间。

    类的所有对象共享一个静态成员。如果不存在其他初始化,则在创建第一个对象时将所有静态数据初始化为零。

    【讨论】:

    • 它与普通的非类静态变量有什么不同?
    • 当我们将一个类的成员声明为静态时,这意味着无论创建多少类对象,静态成员都只有一个副本。对于非静态类成员,情况并非如此。为每个不同的对象创建不同的非静态变量副本
    • 当你必须与一个类的所有实例共享一些数据时使用静态成员。假设你正在设计一个视频游戏。你有 2 个英雄和 100 个敌人。然后,有 100 个敌人被声明为静态成员,因为两个英雄都必须使用此信息..
    【解决方案4】:

    我的差异列表:

    1. 您可以将静态类成员设为受保护或私有。
    2. 您不能将静态类成员设为全局。

    想不到别的了。

    【讨论】:

      【解决方案5】:

      静态类成员用于在类的不同实例之间共享数据。这些成员的存储空间只分配一次,并且只有静态成员的这个实例可用于类的所有对象。

      函数内部的静态变量是通过函数调用保留其值的变量。 一个经典但简单的示例是函数中的 int 类型静态计数器,您希望跟踪该函数被调用的次数。由于 this 通过调用保留其值,因此您可以在每次调用时在函数内部递增它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多