【发布时间】:2020-08-20 09:03:28
【问题描述】:
我现在正在阅读 Stroustrup 的“The C++ Programming Language, 4th edition”,文中有这样几行:
"我使用标准库 memcpy() 来复制 源到目标。这是一个低级的,有时非常讨厌的功能。应该使用 仅当复制的内存中没有具有构造函数或析构函数的对象时,因为 memcpy() 对类型一无所知。”
据我所知,类对象是一个连续的内存块,仅包含类表示,即仅包含其类的数据成员。在我看来,所有成员函数(构造函数、析构函数、赋值等)似乎都存储在“其他地方”,而不是在这个类对象中。但是在这些话之后,在我看来,构造函数也存储在类对象中,也就是说,类对象的内存块中有一些字节代表相应类的构造函数。真的是这样吗?我对什么类对象的内存块的看法有误吗?
【问题讨论】:
-
Stroustrup 只想说,构造函数永远不会被调用。因此,使用 memcpy 你不会得到你的类的有效对象
-
@Thrasher 我真的认为类对象的内存块只包含类的数据成员吗?
-
是的,基本上。继承有点复杂(但本质上相同)。
-
关于之前的评论 - 使用虚函数时添加了vitual table pointer。
-
自然语言可能是模棱两可的,我可以看出你的困惑来自哪里。但不,这不是 Stroustrup 的意思。他的意思是这些对象不是使用构造函数/析构函数进行初始化/取消初始化的类型。这样的类型不仅仅是内存块。它们的构造函数/析构函数可以强制执行某些仅
memcpy无法继承的不变量。
标签: c++ object constructor