我只是一个简单的问题。举个例子,用C ++中的函数:
queue<int> q1;
q1.push(1);
queue<int> q2=q1;
我知道“q1”和“q2”本身只是地址(就像一个指针,我是对的吗?)可能存储在堆栈上,而真实数据存储在堆上。所以,如果我弹出q2,会出现1吗?
答案 0 :(得分:5)
我知道“q1”和“q2”本身只是地址(就像一个指针,我是对的吗?)可能存储在堆栈上,而真实数据存储在堆上。
假设queue
为std::queue
,写下时:
std::queue<int> q1;
您正在有效地分配std::queue
个对象。对象是存储器中的空间区域。在这种特殊情况下,使用自动内存分配q1
(以及q2
);这意味着当相应的符号超出范围时,它将被释放。
因此,不:q1
和q2
不是简单的指针。指针通常使用T*
类型(对于任何T
)声明,此处不存在。
所以,如果我弹出q2,会出现1吗?
不,它不会。 std::queue
的{{3}},名为:
std::queue<int> q2 = q1;
将执行copy constructor,导致两个不相关的std::queue
。这意味着两个对象q1
和q2
之间的空间区域 不 共享。
如果您愿意,可以使用以下参考资料:
std::queue<int> q1;
std::queue<int>& q2 = q1;
在上面的示例中,q1
和q2
引用了同一个对象。
答案 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
中所有内容的副本对其进行初始化。然后,您可以在front
和q1
上致电q2
,两者都会返回1
。如果您在pop
上致电q1
,则q2
的队列中仍会有1
。