繁体   English   中英

C ++中的静态类成员变量和静态变量

[英]Static class member variable and static variable in c++

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

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

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那样污染全局名称空间。

修饰语protectedprivate表明您不希望“局外人”访问这些值。

protectedprivate 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);

至少要补充一点:如果您不应该使用静态,则是完整的其他讨论

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

那是不对的:

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。
  • 静态成员变量可以用作其类中成员函数的默认参数。 与常规静态变量相反,除非它们是全局变量。

用途:如果在两种情况下都希望变量在程序结束前都有效,但是静态成员变量可以访问该类的私有部分。

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

如果声明静态成员为public,则也可以不使用成员函数来访问它。.static与变量的范围无关。.它仅指定存储期限。

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

我的差异清单:

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

想不到别的了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM