关于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::vector 和 wallet.emplace(("5391 0375 9387 5309", "John Bowman", 2500) 并让向量负责所有内存管理对我来说。在现代 C++ 中,不应该大量使用 new/delete。 @PepijnKramer 有点太短了;不仅分配内存(这是operator 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++指针赋值的问题的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++中二级指针的定义,初始化,赋值问题

C++ 指针取消引用赋值

为指针向量赋值

C++之拷贝构造与拷贝赋值

C++ 指针赋值给出了意想不到的(?)结果

C++字符指针数组的初始化及赋值问题