在C ++中,是对象的名称(如队列,映射)引用(或指针)?

时间:2013-11-28 01:16:13

标签: c++ variables pointers reference

我只是一个简单的问题。举个例子,用C ++中的函数:

queue<int> q1;
q1.push(1);
queue<int> q2=q1;

我知道“q1”和“q2”本身只是地址(就像一个指针,我是对的吗?)可能存储在堆栈上,而真实数据存储在堆上。所以,如果我弹出q2,会出现1吗?

3 个答案:

答案 0 :(得分:5)

  

我知道“q1”和“q2”本身只是地址(就像一个指针,我是对的吗?)可能存储在堆栈上,而真实数据存储在堆上。

假设queuestd::queue,写下时:

std::queue<int> q1;

您正在有效地分配std::queue个对象。对象是存储器中的空间区域。在这种特殊情况下,使用自动内存分配q1(以及q2);这意味着当相应的符号超出范围时,它将被释放。

因此,不:q1q2不是简单的指针。指针通常使用T*类型(对于任何T)声明,此处不存在。


  

所以,如果我弹出q2,会出现1吗?

不,它不会。 std::queue的{​​{3}},名为:

std::queue<int> q2 = q1;

将执行copy constructor,导致两个不相关的std::queue。这意味着两个对象q1q2之间的空间区域 共享

如果您愿意,可以使用以下参考资料:

std::queue<int> q1;
std::queue<int>& q2 = q1;

在上面的示例中,q1q2引用了同一个对象。

答案 1 :(得分:2)

当你写:queue<int> q1;

q1不是地址时,它是一个对象。 如果你这样做

auto q1 = new queue<int>();

q1将是一个地址,即指向新创建的对象的指针。当您编写:queue<int> q2=q1;时,您将调用复制构造函数,即

queue<int>::queue(const queue<int>& src);

来初始化q2对象,因此q2将是同一个东西作为q1,即对象不是地址。 (可能不会在内部指向同一堆区域,其中存储q1的元素)

关于第二个问题:当您创建

queue<int> q1;

时,您的对象可能会为将要存储的元素分配空间堆,因为容器通过动态分配内存来在内部存储它的元素。

关于您的上一个问题:不,如果您从 q2点击某些内容,则更改也不会反映在q1中。如果您需要更改将反映在q2中,您必须创建q2作为q1的引用,即queue<int>& q2 = q1;

答案 2 :(得分:2)

queue<int> q1;

这声明了一个自动变量。也就是说,q1是一个实际的对象,而不是一个地址。当q1超出范围时,将自动调用其析构函数。

q1.push(1);

这会将int推送到队列中,其值为1。在内部,队列将设置动态内存结构来保存值,但这对您来说是透明的。

queue<int> q2 = q1;

这将创建一个名为q2的新自动变量,并使用q1中所有内容的副本对其进行初始化。然后,您可以在frontq1上致电q2,两者都会返回1。如果您在pop上致电q1,则q2的队列中仍会有1