[英]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)这是一个深或浅的副本?
如果我遗漏了重要的一点,我道歉。 我不是一个程序员,所以这样的事情很容易让我困惑。 文献让我更加困惑。 感谢您的时间。
在C ++中, this
被定义为指向当前对象的(不可修改的)指针。 出于这个原因,你用this->aMember
访问aMember
。 这是独立于该类型的aMember
了。 (注:使用this->aMember
仅相当于使用aMember
只要有使用同一名称的局部变量或函数参数)。
因为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
相关联的相同对象(浅层复制的情况)。
在这里,你没有任何指针成员变量,所以“深”与“浅”副本的概念在这种情况下失去了意义。
当你有一个指针时,你使用->
.
当你有一个参考。 数据成员作为this->ObjectBDataMember
访问,因为this
是一个不可修改的指向self的指针。 因此,您需要->
(offset)运算符来访问其ObjectBDataMember
。 应该注意的是,您不必使用自引用this
指针来访问对象自己的数据成员。 它只是一种用于强调代码访问对象自己的数据成员的样式。 当您访问另一个对象的数据成员并且它们具有相同的成员(由于是相同的对象类型)时很有用。
这些对象没有分配的对象,只有普通的旧数据类型。 所以这是一个浅薄的副本。 对象的浅表副本会复制其值,但不会分配任何新对象。 它只将指针复制到任何已分配的对象。 深层复制会生成所有值类型成员的副本,以及创建自己的已分配对象(通常复制源复制对象子对象中的值)。
this->ObjectBDataMember
与深拷贝或浅拷贝无关。 this
是一个指针,所以它的成员总是通过->
访问。 好吧,你可以做(*this).ObjectBDataMember
。
和...之间的不同
int ObjectBDataMember;
和
int *ObjectBDataMember;
如果你想设置它的价值你会做:
this->ObjectBDataMember = 5;
VS
*(this->ObjectBDataMember) = 5;
this
是ObjectBType*
(指针),所以要访问其成员,您需要指定->
。 顺便说一句, this
是成员函数中的隐式变量,你可以省略它: ObjectBDataMember = objecta->DataAccessor();
我建议先完成任何好的C ++书籍,这将解决很多像这样的潜在问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.