OOP 中联合的用法
Usage of Union in OOP
联合可以像类和结构一样用作类型(有一些限制(。它可以具有成员函数。它可以用作 OOP 构造。
据我了解,联合只是导入到C++以保持与 C 的向后兼容性。
在这么多年的编程中,我从来没有使用过联合,就像我使用类或结构作为OOP结构一样。
Union 作为 OOP 构造(不仅仅是数据类型(是否有任何实际用途,或者它只是语言中从未有用的一些残余部分?
编辑:
该标准绝对允许联合充当 OOP 构造。它允许工会中的成员职能。以下代码可编译和工作,并且符合标准:
union A
{
int a;
int k;
void doSomething(){}
};
int main()
{
A obj;
int i = obj.a;
obj.doSomething();
return 0;
}
如果标准不应该充当 OOP 构造,为什么它允许联合中的成员函数?
请发布带有具体推理的答案,请不要发布我不这么认为的答案,没有很好的理由说明原因?
不,联合不是 OO 构造。
OO最重要的一个特征是多态性,但联合不能参与继承关系(不能是不同类型的基,不能有基本身(或具有虚函数。联合的唯一用途是提供数据类型,而不是对象。
我个人的观点是"否"。
从历史上看,C 语言允许开发人员对主机系统进行低级访问,以非常灵活的方式访问内存。通过提供一种构造来将同一内存区域视为不同的数据类型,这种灵活性变得更加容易。
但是很难看出如何将其归类为任何类型的面向对象构造。
这不是好的做法,但假设您可以有力地保证只有一个字段处于活动状态:
class multi_type {
private:
bool unit_is_float;
union {
float float_member;
int int_member;
};
public:
multi_type(bool is_float) : unit_is_float(is_float) {}
bool isFloat() { return unit_is_float; }
bool isInt() { return !unit_is_float; }
float& getFloat() {
if (!isFloat()) throw std::logic_error("not a float");
return float_member;
}
int& getInt() {
if (!isInt()) throw std::logic_error("not an int");
return int_member;
}
};
格式简洁,不漂亮。
有效的应用程序可能位于某种解析库中,其中要解析的语言可以具有不同类型的令牌,这些令牌只能在运行时确定。 这是使用 void* 的替代方法。
我认为没有。
联合与面向对象无关。
C++从未说过它打算只支持OO。C++从一开始就支持多种范式(同时:过程式、功能式、生成式、面向对象(
C++ 11 支持">不受限制的联合",但从 OO 的角度来看,我没有看到任何用法
根据作者的不同,面向对象需要以下问题:
- 身份
- 继承/通才
- 多态性
- 封装
如果是工会,第一个问题是有效的。可以识别一个工会(例如通过其地址(
工会没有继承的概念。
有人可能会争辩说数据是联合中的多晶型,但这种解释与oo认为的多晶型相去甚远。一个联合不可能有虚函数,如果没有继承,虚函数几乎是无用的。它会破坏内存布局。
联合中有封装。但是,由于限制,我不希望在这种情况下使用有用的应用程序。如果有的话,我将不胜感激一个链接
有了这组功能,我认为"抽象数据类型"(ADA(是正确的术语。
从Microsoft帮助:
C++联合是类类型的有限形式。它可以包含访问权限 说明符(公共、受保护、私有(、成员数据和成员 函数,包括构造函数和析构函数。它不能包含 虚函数或静态数据成员。它不能用作基础 类,也不能有基类。成员的默认访问权限 工会是公开的。
甚至可以对联合进行模板化(例如,请参阅模板 - 完整指南(。从这个意义上说,联合提供了几乎相同程度的封装。
尽管有所有这些语法限制,联合确实填补了打破C++类型系统的小漏洞。考虑这些松散的对应关系:
class/struct with virtual functions <--> dynamic_cast
class/struct without virtual functions <--> static_cast
union <--> reinterpret_cast
多态性就是以安全和可控的方式打破类型系统。类和结构及时破坏了类型系统。使用虚函数,我们可以在运行时破坏类型系统;没有虚函数,我们可以在编译时完成(尤其是使用模板(。另一方面,联合可以打破现有的类型系统。请注意,多态性和封装是齐头并进的:任何容易更改的内容都会对用户隐藏(通过 vtables、编译时查找或数据重新解释(。
这是否足以将工会标记为OO编程风格的一部分,对我来说似乎是一个品味问题。
作为低级构造,如果数据根据上下文具有不同的解释和类型,则联合很有用。从这个意义上说,与保留不能同时存在的不同字段相比,它可以帮助您保持对象更小。
这是对OOP的有效关注吗?有点,我猜...
--
人们用它们做的一个黑客是访问具有不同名称的不同字节(典型示例是具有 4 个字节 r、g、b、a 和一个 32 位整数颜色的联合(,但这 https://stackoverflow.com/a/1582389/278842 具有潜在的危险。
- 这个指针在c++中的用法
- c++中的oop(密码生成)
- 当C++中需要自动删除时,这是静态的正确用法吗?
- OOP 中的单成员指针
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- OOP使用不同的结构与孩子一起构建建议
- OOP 标识派生对象
- 什么模板用法在阶乘中更好
- 标识符Class_name未定义C++ oop
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- OOP 中联合的用法