簡體   English   中英

c ++中的靜態成員

[英]static member in c++

我在c ++中嘗試使用static關鍵字。 以下類有一個名為size的靜態變量,初始化為10。

class staticTest
{
    public:
            static int size;
            int x,y;

            staticTest()
            {
                x=0;
                y=0;
            }
            void display()
            {
                printf("%d %d\n",x,y);
            }
};   
int staticTest::size=10;

現在我有另一個使用這個靜態變量的類。 這是另一個班級

class my
{
    public:
            int a[staticTest::size];

            my()
            {
                for(int i=0;i<staticTest::size;i++)
                {
                    a[i]=i;
                }
            }

            void display()
            {
                for(int i=0;i<staticTest::size;i++)
                {
                    printf("%d\n",a[i]);
                }
            }
};   

現在我有這樣的主要功能

main()
{
    my ni;
    ni.display();
}

我無法編譯此程序。 錯誤是數組綁定不是整數常量。 為什么會這樣?

只有編譯時常量可以用作數組大小。

將整數聲明為static const int

此外,(默認)值需要在聲明中,而不是定義:

// in header
class Foo {
public:
  static const int n = 10;
};

// in implementation
const int Foo::n;

根據您的評論,請考慮這一點:目前,您正在有效地使用全局變量來傳達一些動態數量。 這應該響起警鍾:

int size; // global

void some_UI_function(); // modifies `size`?!

void some_computation()
{
  int data[size]; // pseudo-code
  // ...
}

由於各種原因,這是一種糟糕的設計。 相反,您應該使相關大小成為該類的一部分:

class my
{
  std::vector<int> m_data;
public:
  my(std::size_t n) : m_data(n) { }
  // ...
};

現在,您可以在本地傳達所需的大小:

int main()
{
  size_t n = get_data_from_user();
  my x(n);
  x.compute(); // etc.
}

數組是靜態的,這意味着它們的大小是在編譯時設置的。 因此,您需要使用整數常量來聲明數組。

在類定義中使用static關鍵字並不意味着變量不會改變,而是整個類都有一個變量副本(而不是每個實例都有一個副本)。 再加上你只能在編譯時使用已知值作為數組大小的事實,就會給你帶來錯誤。

您可以通過將size更改為const並為其賦值來修復編譯錯誤:

static const int size = 5; // 5 for instance

但是,當你嘗試獲取該變量的地址時會發生奇怪的事情,因為它實際上並不存在於任何地方1 ,所以首選的方法是在你的定義中使用它:

static const int size;

然后在一個實現( .cpp )文件中,定義:

static const int staticTest::size = 5;

1它可能看起來不像,但這個變量只有一個定義而沒有聲明。 在一些編譯器中,它可能會起作用,它們只會在與它所代表的數字一起使用的地方替換該變量,但它是未定義的行為,並且在其他行為中將無法鏈接,因此不要指望它(正如James所指出的那樣) Kanze在評論中)。

這是因為你的靜態變量可以在程序的持續時間內改變值,如果添加const限定符,就像static const int size = 10; 它應該按預期工作。

static關鍵字指定變量具有靜態持續時間(在程序開始時分配,在程序結束時分配)。

只有編譯時常量可以用作數組大小。 將您的大小聲明為靜態常量,同時請注意默認值必須在聲明中,而不是在definatio中


根據你的評論使用來動態決定數組的大小----

當已知所需的數組大小時,使用new運算符為其分配內存,並將該內存的地址保存在指針中。 請記住:指針可以像數組一樣下標。 下面的示例讀入一個數字並分配該大小數組。

int* a = NULL;   // Pointer to int, initialize to nothing.

int n;           // Size needed for array
cin >> n;        // Read in the size
a = new int[n];  // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
    a[i] = 0;    // Initialize all elements to zero.
}
. . .  // Use a as a normal array
delete [] a;  // When done, free memory pointed to by a.
a = NULL;     // Clear a to prevent using invalid memory reference.

static關鍵字指定變量具有靜態持續時間(在程序開始時分配,在程序結束時分配)。

括號[]中的元素字段表示數組要保存的元素數,必須是常量值,因為數組是非動態內存塊,其大小必須在執行前確定 為了創建具有可變長度的數組,需要動態存儲器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM