gpt4 book ai didi

c++ - 为什么下面的类不对数组 arr 进行浅拷贝?

转载 作者:行者123 更新时间:2023-11-28 01:23:22 24 4
gpt4 key购买 nike

我正在为基于固定大小数组的堆栈实现以下类:

class Stack{
private:
int arr[1000];
int size;
public:
Stack(){ size=0; }
int top(){
assert(size>0);
return arr[0];
}
void push(int v){ assert(size<1000); arr[size++] = v; }
void pop(){ assert(size>0); size--; }
bool empty(){ return size==0; }
bool is_equal(Stack s){
Stack c = *this;
while(!c.empty() && !s.empty()){
if (c.top() != s.top())
return false;
c.pop();
s.pop();
}
return c.empty() && s.empty();
}
};

据我所知,is_equal 方法的第一行将创建另一个对象 (c),但 arr 属性将指向原始对象的相同数据。因此从 c 中弹出数据将影响原始堆栈的 arr。

令人惊讶的是,这并没有发生。

堆栈 c 的 arr 地址与原始堆栈的 arr 地址不同,并且数据被正确复制,就好像我重载了赋值运算符一样。

我错过了什么吗?

最佳答案

According to my knowledge the first line of the is_equal method will create another object (c) but the arr attribute will point to the same data of the original object. Thus popping data from c will affect the original stack's arr.

不,那是错误的。 Stack 对象将被复制并获得自己的存储空间。复制数组意味着将其所有元素复制到内存中的不同部分。 c*this 是两个不同的 Stack 对象,具有两个不同的数组。

关于c++ - 为什么下面的类不对数组 arr 进行浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55130167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com