1

如果我的理解是正确的,以下语义适用于 C++、C# 和 D 中的结构和类:

        struct          class
----------------------------------
C++     stack/heap      stack/heap
        value/reference value/reference

C# / D  stack           heap
        value           reference

即,在 C++ 中,结构和类之间没有语义差异(除了默认的公共/私有访问)。相比之下,C# 和 D 结构具有值语义和堆栈分配(至少在默认情况下),而 C# 和 D 类具有引用语义和堆分配。

我的问题是:将 struct 关键字专门用于所有具有值语义的实体,将 class 关键字专门用于所有具有引用语义的实体来模仿这种差异是否是一种好的 C++ 风格?

它当然是一个编译器不强制执行的自律工具,但它可以提高代码的可读性,尤其是对于具有 C#/D 背景的审阅者。OTOH,C++ 中的当前习惯用法似乎只对简单实体使用 struct 关键字,例如纯 POD 聚合和模板元函数,因此它可能会让 C++ 程序员感到困惑。

4

2 回答 2

1

在 C++ 中,结构和类基本上是相同的,除了一个主要具有私有成员的类而一个结构具有默认的公共成员。它们对分配内存的位置没有影响。

虽然这是个人喜好问题,但在 C++ 中,通常使用结构作为值对象将值组合在一起,并将类用于完全实现值语义的功能齐全的构造(赋值运算符、构造函数......)。

要将类或结构放在动态内存中,您应该使用 new 运算符并有一个指向 onbject 的指针。

 my_object *mop=new my_object();

或者用智能指针将它与引用计数或范围联系起来。

 std::unique_ptr<my_object> mop(new my_object());

或使用引用计数

 std::shared_ptr<my_object> mop(new my_object());

您应该始终尝试将堆栈用于大多数项目,并让容器保存大型数据结构。

于 2012-04-16T14:18:32.743 回答
1

如果这是唯一相关的区别,那可能是有道理的。在实践中,它的意义远不止于此。在 C++ 中,将具有真实行为的对象(并且不支持复制)分配到堆栈上是非常频繁的;动态分配纯数据容器的情况也时有发生。C# 和 D 混淆了两个正交的区别:任意对象生命周期与链接到范围的对象生命周期,以及对象是否具有值语义。虽然这两个区别对于某些类型确实是一致的,但这不是一个绝对的规则,并且在语言级别上强加它会创建一个直截了当的夹克,有时会阻止使用最干净和最自然的解决方案。

于 2012-04-16T14:45:47.613 回答