[英]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.