关于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);
以上语句做了两件事:
- 在堆上创建一个
CreditCard
对象
- returns 指向已创建对象的指针
案例二
现在让我们看一下代码片段中的语句:
wallet[0] = new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
这条语句做了三件事:
- 在堆上创建一个
CreditCard
对象
- returns 指向已创建对象的指针
- 将第2步返回的指针赋给
wallet[0]
案例三
同样,
wallet[1] = new CreditCard("3485 0399 3395 1954", "John Bowman", 3500);
涉及三件事:
- 在堆上创建一个
CreditCard
对象
- returns 指向已创建对象的指针
- 将第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]
.
我对这些指针感到困惑。正如下面的代码所示,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);
以上语句做了两件事:
- 在堆上创建一个
CreditCard
对象 - returns 指向已创建对象的指针
案例二
现在让我们看一下代码片段中的语句:
wallet[0] = new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
这条语句做了三件事:
- 在堆上创建一个
CreditCard
对象 - returns 指向已创建对象的指针
- 将第2步返回的指针赋给
wallet[0]
案例三
同样,
wallet[1] = new CreditCard("3485 0399 3395 1954", "John Bowman", 3500);
涉及三件事:
- 在堆上创建一个
CreditCard
对象 - returns 指向已创建对象的指针
- 将第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]
.