我對指標感到困惑。正如下面的代碼所示,CreditCard 是在頭檔案中定義的一個類,我們定義了一個包含 10 個 CreditCard 指標的向量。定義后,我們為向量分配了 3 張新卡片。很明顯,向量的元素應該是指向 CreditCard 的型別指標,但是我們實際上分配的是 CredicCard 物件而不是指向它的指標。此外,每張信用卡前面的“新”是什么?誰能給我解釋一下?謝謝!
(代碼來自 C 2nd Edition 的 Data Structures and Algorithms by Michael T. Goodrich(作者)、Roberto Tamassia(作者)、David M. Mount(作者))
vector<CreditCard*> wallet(10); // vector of 10 CreditCard pointers
// allocate 3 new cards
wallet[0] = new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
wallet[1] = new CreditCard("3485 0399 3395 1954", "John Bowman", 3500);
wallet[2] = new CreditCard("6011 4902 3294 2994", "John Bowman", 5000);
uj5u.com熱心網友回復:
定義后,我們為向量分配了 3 張新卡片。很明顯,向量的元素應該是指向 CreditCard 的型別指標,但是我們實際上分配的是 CredicCard 物件而不是指向它的指標。
不,我們不會為向量分配 3 張新卡片。相反,我們將指標分配給在堆上創建的 CreditCard 物件。考慮以下示例:
案例一
new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
上面的陳述句做了兩件事:
CreditCard在堆上創建一個物件- 回傳指向該創建物件的指標
案例二
現在讓我們看看代碼片段中的陳述句:
wallet[0] = new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
這個陳述句做了三件事:
CreditCard在堆上創建一個物件- 回傳指向該創建物件的指標
- 將步驟 2 中回傳的指標分配給
wallet[0]
案例三
相似地,
wallet[1] = new CreditCard("3485 0399 3395 1954", "John Bowman", 3500);
涉及3件事:
CreditCard在堆上創建一個物件- 回傳指向該創建物件的指標
- 將步驟 2 中回傳的指標分配給
wallet[1]
您可以在 C 中查看堆疊上的物件與堆上的物件,以了解有關堆和堆疊的更多資訊。
另請注意,當您在堆上創建物件而不使用智能指標時,您必須使用delete.
更多例子
在堆疊上創建物件
//create a vector of CreditCard objects instead of creating a vector pointers to CreditCard objects
std::vector<CreditCard> wallet(10); //create a vector of size 10 of CreditCard objects
wallet[0] = CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
wallet[1] = CreditCard("3485 0399 3395 1954", "John Bowman", 3500);
wallet[2] = CreditCard("6011 4902 3294 2994", "John Bowman", 5000);
請注意,在上面的代碼片段中,我沒有使用關鍵字new。所以我們創建了 3 個CreditCard物件,然后將這些物件分配給wallet[0]、wallet[1]、wallet[2]。
在堆上創建物件
//create a vector of pointers to CreditCard objects instead of creating a vector of CreditCard objects
vector<CreditCard*> wallet(10); // vector of 10 CreditCard pointers
// Create 3 CreditCard objects on heap and then assign the pointer returned to them to the left hand side`
wallet[0] = new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
wallet[1] = new CreditCard("3485 0399 3395 1954", "John Bowman", 3500);
wallet[2] = new CreditCard("6011 4902 3294 2994", "John Bowman", 5000);
在上面的代碼片段中,我們使用了關鍵字new(與上一個示例不同)。使用關鍵字的效果new是我們在堆上創建一個物件,然后回傳指向該物件的指標,該指標被分配給wallet[0], wallet[1], wallet[2]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368779.html
