模仿结构/类之间的 C# / D 差异会很好C++风格吗?

Would it be good C++ style to mimic the C# / D difference between struct / class?

本文关键字:很好 C++ 风格 结构 之间      更新时间:2023-10-16

如果我的理解是正确的,以下语义适用于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++程序员可能会感到困惑。

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

在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());

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