关于c++指针赋值的问题
Posted
技术标签:
【中文标题】关于c++指针赋值的问题【英文标题】:Problem about c++ pointers assigning values 【发布时间】:2022-01-05 03:47:48 【问题描述】:我对指针感到困惑。如下代码所示,CreditCard 是在头文件中定义的一个类,我们定义了一个包含 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);
【问题讨论】:
new
- "...创建并初始化具有动态存储持续时间的对象,即其生命周期不一定受创建范围限制的对象...。 " , "...new-expression 返回一个指向构造对象的(prvalue)指针..." en.cppreference.com/w/cpp/language/new
New 为堆上的对象分配内存。但是我不会以这种方式使用向量,我会使用 std::vectoroperator new
所做的,但不应与new
表达式混淆),而且还构造对象(即调用构造函数)。
你可能想看看good C++ book,应该很早就在那里解释...
@aconcagua 是的,你是对的。新的也这样做
【参考方案1】:
定义后,我们将 3 张新卡片分配给向量。很明显,向量的元素应该是指向 CreditCard 的类型指针,但我们实际上分配的是 CredicCard 对象而不是指向它的指针。
不,我们没有为向量分配 3 张新卡片。相反,我们将指针分配给在堆上创建的 CreditCard 对象。请考虑以下示例:
案例一
new CreditCard("5391 0375 9387 5309", "John Bowman", 2500);
上面的语句做了两件事:
-
在堆上创建一个
CreditCard
对象
返回指向所创建对象的指针
案例二
现在让我们看一下代码 sn-p 中的语句:
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);
涉及三件事:
-
在堆上创建一个
CreditCard
对象
返回指向所创建对象的指针
将步骤 2 中返回的指针分配给 wallet[1]
您可以查看Objects on a stack vs Objects on a heap in 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);
请注意,在上面的代码 sn-p 中,我 未使用关键字 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);
在上面的代码 sn-p 中,我们使用了关键字new
(与上一个示例不同)。使用关键字new
的效果是我们在堆上创建一个对象,然后返回指向该对象的指针,该指针分配给wallet[0]
、wallet[1]
、wallet[2]
。
【讨论】:
感谢您的解释。但是我还是不明白为什么这段代码返回的是指针而不是对象?或者,如果我想在这里返回一个对象,代码会是什么样子? @kaiyuwei 我在答案的末尾添加了更多示例。看看这个。我还添加了一个示例,其中我们不返回指针,而是根据需要返回对象本身。 这样就清楚多了!我想我的困惑主要是关于“新”表达的使用。由于我是 C++ 初学者,我真的需要了解更多。以上是关于关于c++指针赋值的问题的主要内容,如果未能解决你的问题,请参考以下文章