【问题标题】:what means by using 'new' to create a temp object?使用“新”创建临时对象是什么意思?
【发布时间】:2021-11-23 16:23:15
【问题描述】:
#include <iostream>
using namespace std;

class Place{
private:
    int park;
    int num;
public:
Place() { park=1; num=1;};
}

int main{
Place* pool = new Place;
delete pool;
}

所以对于这部分代码Place* pool = new Place;,我相信默认构造函数会被调用,这意味着对象pool现在也被创建并指向一个带有Place类的临时对象。但究竟是什么意思?是指pool对象指向整个temp对象还是说pool对象中的每个数据成员分别指向temp对象中的数据成员?

另外,当Place* pool = new Place;被调用时,临时对象和pool都被默认构造函数初始化了吗?还是只有 temp 对象由默认构造函数初始化?在学习OOP主题和与构造函数和析构函数相关的主题时,我感到很迷茫。我希望我不要问一个愚蠢的问题。非常感谢您的所有帮助。

【问题讨论】:

  • “临时对象”是什么意思? new Place; 动态分配 Place 类型的对象并调用其默认构造函数(并返回指向它的指针)。在这段代码 sn-p 中也完全没有必要,Place pool; 可以正常工作(如果不是更好的话)
  • 没有临时对象。如果你手动新建,别忘了删除销毁。请编写正确的构造函数。您的 int 值在构造函数主体中被初始化为 0 并被 1 覆盖。好的,编译器会在这种特殊情况下优化它。但从形式上看,这不是你所期望的!
  • 我只是想知道这行代码是什么意思。正如Place* pool = new Place; 出现在我的作业中一样。但我不太明白 new 运算符如何处理对象类型。
  • 这里是new expression,如果这是混淆的来源,您必须查找该术语而不是operator new
  • Google 是您的朋友。简而言之,就是在堆上分配内存(对于 Place 的成员来说足够大),将地址分配给池,并调用构造函数来初始化内存(最后两个不一定按顺序)。除非你调用delete,否则直到程序终止才会释放内存。

标签: c++ class oop constructor new-operator


【解决方案1】:

对于初学者有几个错别字。

例如你写了一个括号而不是右大括号

Place() { park=1; num=1;)
                       ^^^

你忘了在类定义后面加分号。

pool 是一个指针。指针旨在存储地址。 pool 不是 Place 类型的对象。该指针指向动态分配的Place 类型的对象。使用指针,您可以访问指向对象的公共成员。 为了清楚起见,您可以拆分此声明

Place* pool = new Place;

进入这些陈述

Place* pool = nullptr;
pool = new Place;

【讨论】:

  • 非常感谢。我已经纠正了。那么指针pool的类型是什么?那个类类型是 Place 吗?
  • @ttt23 指针的类型从它的声明地方 * 可以看出。有什么问题?!
  • 所以指针pool只是一个没有任何数据成员的指针。而它指向的是构造函数初始化的分配内存?
  • @ttt23 指针是基本的标量对象。它们不是用户定义的对象。因此,当声明指针时,都不会调用构造函数。在所呈现的程序中,指针将使用 new 运算符指向动态分配的对象。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多