模仿结构/类之间的 C# / D 差异会很好C++风格吗?
Would it be good C++ style to mimic the C# / D difference between struct / class?
如果我的理解是正确的,以下语义适用于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());
您应该始终尝试将堆栈用于大多数项目,并让容器保存大型数据结构。
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 很好的语法来获取对向量/数组数据的大小引用?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 尽管一切看起来都很好,但值不会交换
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 使用移位的无符号数字作为数组的索引号是一种很好的做法
- 是否很好地使用状态模式来维护当前选定的对象?
- C++|以一种很好的方式将树(不一定是二进制的)打印到stdout
- 静态库单独使用很好,但在引用时会抛出错误
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 有没有办法关闭文件? fclose 不能很好地工作
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- libc++:为什么流关闭后仍然很好
- 不能很好地运行HElib,但它建立在Windows 10 x64上
- 接口在C++中是一种很好的做法吗?