这是好的C++;样式来模仿struct/class之间的C#/D差异? 如果我的理解是正确的,下面的语义适用于C++、C语言和D:中的结构和类 ,即C++中,结构和类之间没有语义区别(除了默认的公共/私有访问)。相反,C#和D结构具有值语义和堆栈分配(至少在默认情况下),而C#和D类具有引用语义和堆分配 P>强>我的问题是:对于所有具有值语义的实体,对于所有具有引用语义的实体,都只使用Stutt关键字来模拟这种差异,这是一个好的C++风格吗?

这是好的C++;样式来模仿struct/class之间的C#/D差异? 如果我的理解是正确的,下面的语义适用于C++、C语言和D:中的结构和类 ,即C++中,结构和类之间没有语义区别(除了默认的公共/私有访问)。相反,C#和D结构具有值语义和堆栈分配(至少在默认情况下),而C#和D类具有引用语义和堆分配 P>强>我的问题是:对于所有具有值语义的实体,对于所有具有引用语义的实体,都只使用Stutt关键字来模拟这种差异,这是一个好的C++风格吗?,c++,class,coding-style,struct,d,C++,Class,Coding Style,Struct,D,它当然是一个编译器不强制执行的自律工具,但它可以提高代码的可读性,特别是对于具有C#/D背景的审阅者。OTHH,C++中的当前习语似乎只对简单实体(如纯POD聚合和模板元功能)使用Strut关键字,因此它可能会使C++程序员感到困惑。C++中的结构和类基本上与一个主要是私有成员的类相同,而一个结构具有完全公共成员。它们对内存分配的位置没有影响 虽然这是一个味觉的问题,但是C++中常用的是使用值结构的对象来组合值并使用完全实现值语义的赋值结构(赋值运算符、构造函数…)。 要在动态内存中放置类或结构

它当然是一个编译器不强制执行的自律工具,但它可以提高代码的可读性,特别是对于具有C#/D背景的审阅者。OTHH,C++中的当前习语似乎只对简单实体(如纯POD聚合和模板元功能)使用Strut关键字,因此它可能会使C++程序员感到困惑。C++中的结构和类基本上与一个主要是私有成员的类相同,而一个结构具有完全公共成员。它们对内存分配的位置没有影响

虽然这是一个味觉的问题,但是C++中常用的是使用值结构的对象来组合值并使用完全实现值语义的赋值结构(赋值运算符、构造函数…)。 要在动态内存中放置类或结构,应使用新运算符并具有指向OnObject的指针

 my_object *mop=new my_object();
或者使用智能指针将其绑定到引用计数或范围

 std::unique_ptr<my_object> mop(new my_object());
std::unique_ptr mop(新的my_对象());
或引用计数

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

您应该始终尝试对大多数项目使用堆栈,并让容器容纳大型数据结构。

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

这是主观的(因此不太适合这样做)。但答案几乎是肯定的:不,用完全不同的语言模仿一种语言的习语和语义不是一个好主意。翻译不是(也不可能)健壮的,因此只会导致混乱。@Oli Charlesworth:为什么它不会健壮?它只是一个注释,表示其他语言用户熟悉的意图。一个原因是,正如您已经说过的,没有语言级别的强制执行。其次,这不能准确地表示C#的语义(例如,内存所有权与垃圾收集),这可能会导致编程错误(特别是内存相关的错误,众所周知很难调试)。您开始模仿类/结构语义,最终通过引用传递参数。不@Oli Charlesworth:堆栈分配的结构会自动清理,通过始终对堆分配的类使用shared_ptr或unique_ptr(这是一个很好的实践),GC点似乎没有什么意义,对吧?感谢您指出了熟悉的堆栈/堆分配机制。我的建议是通过使用struct/class关键字来澄清这种意图。简单地说,任何不意味着作为基类的实体都将被声明为一个结构,其余的将被声明为一个类。谢谢,这是一个非常有帮助和建设性的答案。D仅在涉及到
struct
vs
class
时区分了值类型语义和引用类型语义,您仍然可以将结构放在堆上,将类放在堆栈上。这不是“混淆”(你的意思是“混淆”?)像你这样的两个人错误地宣称。你不能在@safe代码中显式地在堆栈上分配类(尽管编译器在某些情况下可能能够这样做),因为可能会发生悬空引用。
 std::shared_ptr<my_object> mop(new my_object());