关于c ++:无法理解术语’静态’

can't understand the term 'static'

本问题已经有最佳答案,请猛点这里访问。

我正在努力理解"静态手段"这个术语及其工作原理。在这里,我初始化了一个静态变量"float percentage"。我必须使用convertToPercent()将其转换为百分比,转换后,我必须获取该值并将该值放到somemethod()中进行计算。

下面是我所拥有的

h

1
2
3
4
5
6
7
8
9
class Foo     {

private:
    static float percentage;

public :    
    float convertToPercent();

};

CPP

1
2
3
4
5
6
7
8
float Foo::convertToPercent() {
             percentage = (30/100) * 100;
          return percentage;
}

static float someMethod () {
  //place the static percentage value here after doing convertToPercent() method to do some calculation;
}

但是它给了我一个错误信息

1
2
3
Undefined symbols for architecture x86_64:
"Foo::percentage", referenced from:
 Foo::convertToPercent() in Foo.o

请求帮助。谢谢


在这种情况下,static意味着变量percentage不属于类foo的特定实例,而是在foo的所有实例之间共享。

为了让链接器知道这个变量,您需要定义它,而不仅仅是声明它,这就是您得到错误的原因。

1
float Foo::percentage = 0;

在.cpp文件中


必须在类外部定义静态变量。

1
2
3
4
5
6
7
8
// header file
class Foo     {
private:
    static float percentage;
};

// cpp file
float Foo::percentage(0.0);

因为成员变量是静态的,所以在整个进程运行时,在foo类(所有foo对象)的所有实例中,该变量只有一个值是共享的。如果有三个foo对象a、b和c,那么更改对象b中的百分比值也会更改对象a和c中的百分比值。


静态成员在该类的所有对象之间共享。

A static data member is declared in the class declaration and is initialized in the file containing the class methods. The scope operator is used in the initialization to indicate to which class the static member belongs. However, if the static member is a const integral type or an enumeration type, it can be initialized in the class declaration itself.

1
2
3
4
5
6
7
8
class Foo     {
private:
    static float percentage; // this is declaration not definition

public :    
    float convertToPercent();

};

您需要在cpp文件中定义percentage

1
float Foo::percentage(0.0);  // initialize percentage to 0.0

§9.4.2静态数据成员

The declaration of a static data member in its class definition is not a definition and may be of an incomplete type other than cv-qualified void.


您只在类中声明了它,但没有在cpp中给出如下定义:

1
float Foo::percentage;


下面的代码试图声明静态成员变量百分比---好的。

1
2
3
4
5
6
// header file
class Foo    
{
    private:
        static float percentage;       //constant declaration
};

下面的代码试图为尚未定义的对象(百分比)赋值。——不好

1
2
3
4
5
// cpp file
float Foo::convertToPercent() {
         percentage = (30/100) * 100;     //tring to update percentage which is not defined yet.
      return percentage;                 //usage of object (percentage) which is not defined yet.
}

C++要求为您所使用的任何对象提供定义,但STAIC和整型的类特定常量是一个例外。只要你不带他们的地址,你就可以声明他们并使用他们而不提供定义。

在您的例子中,实现文件(.cpp)应该有下面的行,然后您可以在任何适用的地方使用您的"百分比"常量。

1
float Foo::percentage(0.0);     //definition of static class member : percentage