关于c++指针赋值的问题

Problem about c++ pointers assigning values

我对这些指针感到困惑。正如下面的代码所示,CreditCard 是在头文件中定义的 class,我们正在定义一个包含 10 个 CreditCard 指针的向量。定义后,我们将 3 张新卡片分配给向量。很明显,向量的元素应该是指向 CreditCard 的类型指针,但是我们实际上分配的是 CredicCard 对象而不是指向它的指针。此外,每张信用卡前面的“新”是什么?谁能给我解释一下?谢谢!

(代码来自 Michael T. Goodrich(作者)、Roberto Tamassia(作者)、David M. Mount(作者)的 Data Structures and Algorithms in C++ 2nd Edition)

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);

After defining, we assign 3 new cards to the vector. It is clear that the vector's elements should be type pointer to CreditCard, however we actually assign CredicCard objects rather than pointers to it.

不,我们不会将 3 张新卡片分配给向量。相反,我们将指针分配给在堆上创建的 CreditCard 对象。考虑以下示例:

案例一

new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);

以上语句做了件事:

  1. 堆上创建一个CreditCard对象
  2. returns 指向已创建对象的指针

案例二

现在让我们看一下代码片段中的语句:

wallet[0] = new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);

这条语句做了件事:

  1. 在堆上创建一个 CreditCard 对象
  2. returns 指向已创建对象的指针
  3. 将第2步返回的指针赋给wallet[0]

案例三

同样,

wallet[1] = new CreditCard("3485 0399 3395 1954", "John Bowman", 3500); 

涉及三件事:

  1. 在堆上创建一个 CreditCard 对象
  2. returns 指向已创建对象的指针
  3. 将第2步返回的指针赋给wallet[1]

您可以查看 以了解有关堆和堆栈的更多信息。

此外,请注意,当您在堆上创建对象而不使用智能指针时,您必须使用 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].