【问题标题】:Copying C objects复制 C 对象
【发布时间】:2015-09-29 04:03:11
【问题描述】:

我是C 的新手,想问一个关于复制行为的问题。我正在阅读Scott Meyers'C++,他在书中说C++ 可以被认为是一种语言的组合,我们应该将所谓的C 部分C++ 部分区分开来。现在,如果我们必须使用包含以下内容的原生 C API:

FontHandle getFont(); //From, C API

void releaseFont(FontHandle fh); //From the same C API

据我所知,C 语言不允许通过 copy-custructors 定义自定义复制行为。那么,如果我写以下内容,我应该期待发生什么:

FontHandle f1 = getFont();
FontHandle f2 = f1; //What's going to happen here? Deep or shallow copy?

【问题讨论】:

  • FontHandle 大概是指针或整数类型的typedef,当你说char* a; char* b = a; 时,你认为会发生什么?
  • 如果这是C API,那么当然是浅拷贝。 FontHandle 很可能是 typedef'ed 为 intvoid* 或类似的东西。如果您要问的话,仅仅分配一个句柄不可能克隆底层的字体对象。您最终会得到两个具有相同数值的变量。
  • 这可能就是答案。 stackoverflow.com/a/9127315/1099230
  • @IgorTandetnik 你的意思是如果我们有一个指针可以输入 C,例如char* a; 然后写char *b = a,我们将拥有ba 的副本。但是如果我们有char a = 'a'; char b = a;呢?那么复制将如何进行呢?
  • 同理 - ba 的副本。我不确定我是否完全理解您的困惑。

标签: c++ c copy


【解决方案1】:

C 将始终进行“浅”复制。如果变量是指针,则将复制该值。如果变量是结构,结构的内容将被复制(如果内容恰好包含指针,它们的值将像其他所有内容一样简单地复制)。

【讨论】:

  • 如果变量像char这样的原语?
  • 该值将被简单地复制。无论变量是什么,C 都会简单地将支持该变量的内存从一个地方复制到另一个地方。
【解决方案2】:

如果对象 FontHandle 定义了正确的复制构造函数或提供了 operator= 的正确实现,那么您将拥有深层复制(正确复制的对象)

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多