【发布时间】:2020-06-26 12:09:42
【问题描述】:
我正在学习 c++,我正在尝试不同的场景。所以我想做一个浅拷贝一个类,所以这就是我想出的 -
#include <iostream>
class not_dynamic
{
private:
int data;
public:
not_dynamic(int temp_data = 200) //constructor
:data(temp_data)
{
std::cout << "constructor initialized" << std::endl;
}
not_dynamic(const not_dynamic& source)
:data(source.data)
{
std::cout << "copy constructor initialized" << std::endl;
}
void get_info()
{
std::cout << data << " " << &data << std::endl;
}
};
int main()
{
not_dynamic v{ 100 };
v.get_info();
not_dynamic jackie{ v };
jackie.get_info();
}
为此,我得到以下结果 -
constructor initialized
100 00EFFBD4 // 100 is the value in data and 00EFFBD4 is address of data
copy constructor initialized
100 00EFFBC8 // same as above
但我记得在浅拷贝中,不同对象的所有相同实例(两个对象都相同)应该具有相同的内存地址,但在这种情况下它是相同的。
我真的很困惑。你们能帮帮我吗?
谢谢
【问题讨论】:
-
“在浅拷贝中,所有相同的实例……应该有相同的内存地址”——不,是什么让你这么认为?
-
您似乎误解了什么是浅拷贝。对于具有
int成员的类型,“浅”和“深”副本之间没有区别。甚至有人会争辩说,在这种情况下应用这些术语是没有意义的 -
您将复制指针与复制对象的地址混淆了。 当然两个不同对象的两个成员将有不同的地址。但是两个不同对象中的两个指针可能具有相同的值,也可能不具有相同的值(取决于是否完成了深层复制)。
-
C++ 总是按值复制。当您复制指针或类似指针的对象时,会出现浅复制行为。复制一个指针会产生两个指向同一个对象的指针。当这些指针是对象成员时,它们可以共享一个状态。但是
int不是指针,也不是指针,所以复制它永远不会导致状态共享。 -
只有在
struct/class类型的至少一个成员是指针或引用时,深拷贝和浅拷贝之间的区别才有意义。如果该类的唯一成员是int类型,则深拷贝和浅拷贝没有区别(它们是相同的)。
标签: c++ oop deep-copy shallow-copy