7

早上好。我无法理解在共享项目中使用 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)这是深拷贝还是浅拷贝?

如果我遗漏了重要的部分,我深表歉意。我不是一个程序员,所以这样的事情很容易让我感到困惑。文学让我更加困惑。感谢您的时间。

4

5 回答 5

7
  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. */
于 2013-01-16T18:13:40.027 回答
4

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

那是因为this是一个指针,并且->操作符跟随它之前的指针来访问它之后的成员。

“这是深拷贝还是浅拷贝?”

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

术语“深度复制”是指递归复制与被复制对象关联的所有对象:如果数据结构包含作为指针S的成员变量,则将 (say, )的实例深度复制到( say, ) 的另一个实例中意味着递归复制由变量指向的每个对象,以便与这些对象的副本相关联,而不是与关联的相同对象相关联(浅复制就是这种情况)。Ss1Ss2s1s2s1

在这里,您没有任何指针成员变量,因此“深”与“浅”复制的概念在这种情况下失去了意义。

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

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

于 2013-01-16T18:20:06.613 回答
0

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

和...之间的不同

int ObjectBDataMember;

int *ObjectBDataMember;

如果你想设置它的值,你会这样做:

this->ObjectBDataMember = 5;

对比

*(this->ObjectBDataMember) = 5;
于 2013-01-16T18:10:15.283 回答
0
  1. 因为thisObjectBType*(指针),所以要访问它的成员,您需要指定->. 顺便说一句,this是成员函数中的隐式变量,您可以省略它:ObjectBDataMember = objecta->DataAccessor();
  2. ObjectADataMember 的类型是 int,它是基本类型(不是复合类型),所以它只是一个副本。临时“深拷贝”适用于复合类型。

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

于 2013-01-16T18:11:54.500 回答