pointer 標題中的c++數組聲明




dynamic memory allocation中文 (6)

不,這是不可能的。 標題中的數組聲明必須具有不變的大小值。 否則,像“sizeof”這樣的結構就不可能正常工作。 您需要將該數組聲明為指針類型,並在構造函數中使用new []。 例。

class Test { 
    int *a;
public:
    Test(int size) {
       a = new int[size];
    }
    ~Test() { delete [] a; }
private:
    Test(const Test& other);
    Test& operator=(const Test& other);
};

我想知道是否可以聲明一個數組(大小此時不知道),作為一個類的私有成員,然後在類的構造函數中設置大小。 例如:

class Test {
int a[];
public:
Test(int size);
};

Test::Test(int size) {
a[size];   // this is wrong, but what can i do here?
}

這是可能的,或者我應該使用動態數組? 謝謝!


不,這是不可能的。 你應該使用一個動態數組,比如std::vector 。 C99允許一個結構有一個未定義數組作為最後一個成員,但即使你這樣做,你仍然必須自己手動分配內存,例如malloc()


你在說什麼是不可能的。 類總是有一個恆定的大小。 你可以讓你的類使用一個指向動態分配數組的指針,或者你可以使用std :: vector。


首先,初始化構造函數的初始化列表中的東西通常會更好,而不是在構造函數的主體中。

只有在編譯時知道綁定的情況下,才能使用預定義的綁定初始化數組。 在這種情況下,您將需要動態分配空間。

你必須記得有一個析構函數會在對像被銷毀的時候刪除數組,或者你會得到內存洩漏。


簡答:否(數組的大小僅在編譯時定義)
長答案:

您可以使用矢量來達到相同的結果:

class Test
{
    std::vector<int> a;
    public:
        Test(std::size_t size):
            a(size)
        {}
};

請參閱Martin的解決方案(使用std::vector ),並記住,即使您需要將緩衝區傳遞給C API, std::vector也可以通過傳遞&vec[0]

std::vector<char> vec(10);
memset(&vec[0], 0, vec.size());

它保證工作,但只有向量不是空的(C ++ quirks,<sigh>)。





header