【问题标题】:confused with shallow copy constructor and deep copy constructor [duplicate]与浅拷贝构造函数和深拷贝构造函数混淆[重复]
【发布时间】: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


【解决方案1】:

这两个对象仍然是不同的和不同的,并且会有自己的成员变量实例,每个实例存储在不同的位置。

你对浅拷贝所做的基本上相当于:

int a = 10;
int b = a;   // Shallow copy of a

ab 这两个变量仍然是两个不同的变量,即使 a 的值已复制到 b 中。它是被复制的

【讨论】:

  • 好的,那么它与动态分配内存然后分配实例的值有什么不同??如果我动态分配内存,那么两个实例将具有不同的内存地址对吗?为什么会这样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2013-03-09
  • 1970-01-01
  • 2018-12-26
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多