繁体   English   中英

使用对象进行C ++深度复制

[英]C++ deep copying with objects

早上好。 我无法理解在共享项目中使用C ++中的对象进行深度和浅层复制背后的逻辑,因此我创建了以下示例。

int main() {
    ObjectAType* objecta = ObjectAType::New();
    ObjectBType* objectb = ObjectBType::New();

    // some operation to populate data members of object a
    objecta->Operation();

    // assume I have accessors to return datamembers of object a
    // I wish to make a deep copy of SOME of those data members into object b
    objectb->AlignWithA(objecta);

    objecta->Delete();
    objectb->Delete();

    return 0;
}

现在给出对象b类函数如下:

public:
void ObjectBType::AlignWithA(ObjectAType* objecta) {
    this->ObjectBDataMember = objecta->DataAccessor();
}
protected:
int ObjectBDataMember;

并且数据访问器在类def中就是这样的,

public:
int ObjectAType::DataAccessor() {
    return this->ObjectADataMember;
}
protected:
int ObjectADataMember;

我有一些问题。

1)因为在对象b中,数据成员被声明为

int ObjectBDataMember; 

而不是

int *ObjectBDataMember;

为什么数据成员被访问为

this->ObjectBDataMember

而不是

this.ObjectBDataMember

2)这是一个深或浅的副本?

如果我遗漏了重要的一点,我道歉。 我不是一个程序员,所以这样的事情很容易让我困惑。 文献让我更加困惑。 感谢您的时间。

  1. 在C ++中, this被定义为指向当前对象的(不可修改的)指针。 出于这个原因,你用this->aMember访问aMember 这是独立于该类型的aMember了。 (注:使用this->aMember仅相当于使用aMember只要有使用同一名称的局部变量或函数参数)。

  2. 因为ObjectBDataMember是一个int,所以复制它不会被称为浅或深。 这些概念仅用于复制指针的上下文中。

例如:

ObjectBType* b1 = new ObjectBType();

ObjectBType* b2 = b1; // shallow copy. b1 and b2 refer to the same object.
ObjectBType* b3 = new ObjectBType(*b1); /* deep copy. b1 and b3 refer to 
  different objects that happen to have the same value. */

“为什么数据成员被访问为this->ObjectBDataMember而不是this.ObjectBDataMember ?”

那是因为this是一个指针,而->运算符跟随它前面的指针来访问它之后的成员。

“这是一个深刻或浅薄的副本吗?”

如果您指的是整数变量的副本,则可以将其称为浅表副本,但不需要对其进行限定,因为int不是数据结构。

术语“ 深拷贝 ”是指相关联的该对象的所有对象的递归复制被复制的:如果一个数据结构S包含成员变量,其是指针 ,深拷贝的一个实例S (比方说, s1 )插入的另一个实例S (比方说, s2 )意味着递归复制s1变量指向的每个对象,以便s2将与这些对象的副本相关联,而不是与s1相关联的相同对象(浅层复制的情况)。

在这里,你没有任何指针成员变量,所以“深”与“浅”副本的概念在这种情况下失去了意义。

  1. 当你有一个指针时,你使用-> . 当你有一个参考。 数据成员作为this->ObjectBDataMember访问,因为this是一个不可修改的指向self的指针。 因此,您需要-> (offset)运算符来访问其ObjectBDataMember 应该注意的是,您不必使用自引用this指针来访问对象自己的数据成员。 它只是一种用于强调代码访问对象自己的数据成员的样式。 当您访问另一个对象的数据成员并且它们具有相同的成员(由于是相同的对象类型)时很有用。

  2. 这些对象没有分配的对象,只有普通的旧数据类型。 所以这是一个浅薄的副本。 对象的浅表副本会复制其值,但不会分配任何新对象。 它只将指针复制到任何已分配的对象。 深层复制会生成所有值类型成员的副本,以及创建自己的已分配对象(通常复制源复制对象子对象中的值)。

this->ObjectBDataMember与深拷贝或浅拷贝无关。 this是一个指针,所以它的成员总是通过->访问。 好吧,你可以做(*this).ObjectBDataMember

和...之间的不同

int ObjectBDataMember;

int *ObjectBDataMember;

如果你想设置它的价值你会做:

this->ObjectBDataMember = 5;

VS

*(this->ObjectBDataMember) = 5;
  1. 因为thisObjectBType* (指针),所以要访问其成员,您需要指定-> 顺便说一句, this是成员函数中的隐式变量,你可以省略它: ObjectBDataMember = objecta->DataAccessor();
  2. ObjectADataMember的类型是int,它是基本类型(不是复合),所以它只是一个副本。 温度“深度复制”适用于复合类型。

我建议先完成任何好的C ++书籍,这将解决很多像这样的潜在问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM