【问题标题】:Why are things like cin, cout, string, etc. considered objects?为什么像 cin、cout、string 等被视为对象?
【发布时间】:2016-03-09 16:31:42
【问题描述】:

据我了解(以及我的教科书所说),对象是一个自包含的编程元素,它包含数据和对该数据执行操作的过程。话虽如此,为什么像 cin、cout、string 等被视为对象? cin 是我定义的对象吗? cin 是在 iostream 头文件的源代码中找到的自包含单元的名称吗?它包含数据和对该数据执行操作的过程?

【问题讨论】:

  • cincoutstring 的不同之处在于它们是类的实例,而string 是类。
  • std::string 不是对象,它是std::basic_string<char> 的类型别名。而std::basic_string 是一个std::cinstd::cout 分别是 std::istreamstd::ostream 类的特殊实例。
  • 错误假设 1:string 不被视为对象。错误假设 2:“考虑”,因为 C++ 标准精确定义了术语对象。
  • @alan 请注意,C++ 中的对象定义可能与其他语言中的定义不同,尤其是 OOP 语言。在 C++ 中,对象基本上是任何占用空间而不是函数的东西。

标签: c++ c++11


【解决方案1】:

cincout 是变量,因此它们是对象。

在 C++ 中,对象是一个非连续的存储区域,具有类型形式的相关内容解释。

这是由 C++ 标准定义的术语。

C++11 §1.8/1

C++ 程序中的构造创建、销毁、引用、访问和操作对象。 object 是一个 存储区域。 [注意: 一个函数不是一个对象,不管它是否占用存储在 对象的方式。 —尾注 ] 对象由 定义 (3.1)、new-expression (5.3.4) 或 在需要时通过实施 (12.2)。对象的属性是在对象被确定时确定的 创建的。一个对象可以有一个名称(第 3 条)。一个对象有一个存储持续时间n (3.7),它影响 它的生命周期 (3.8)。一个对象有一个 type (3.9)。术语对象类型是指对象的类型 被建造。一些对象是多态的 (10.3);实现生成与相关的信息 每个这样的对象都可以在程序执行期间确定该对象的类型。对于其他 对象,其中找到的值的解释由 表达式 的类型决定(第 5 条) 用于访问它们。

不连续的东西主要是为了支持多重继承,但至少有一位委员会成员在与我的讨论中强烈认为它旨在支持使对象一般不连续。但是,我知道没有现有的编译器可以做到这一点。对我来说似乎毫无意义。

std::string 不是对象,而是类型。


注意:对于其他一些编程语言,以及一般的计算机科学,术语“对象”通常表示类类型的实例。在 C++ 中,甚至非类类型的实例(例如 int)也是对象。

【讨论】:

  • 现在你触及了一个非常有趣的话题。既然对象可以作为字符数组访问,那么在非连续对象的情况下这种访问应该如何工作?
  • 这是一个非常彻底的解释,解决了我认为 OP 甚至没有考虑过的术语。感谢一个很好的答案!
  • @SergeyA:我不确定,但 C++11 §1.8/5 说“可简单复制或标准布局类型 (3.9) 的对象应占用连续的存储字节。”
  • @LokiAstari:经典示例是X 继承AB,它们实际上都继承自Top。那么AB 子对象最多可以有一个是连续的,另一个必须散布一点。这就是(一个原因)为什么虚拟继承会增加运行时间成本。我同意这在其他情况下没有意义。 :)
  • 好的。我打算反对这一点。但是当我写下来时,我意识到从X 的实例中获取对AB 的引用将使其中一个处于令人讨厌的切碎状态。好的。很高兴我不再编写令人讨厌的编译器。
【解决方案2】:

它们被视为对象,因为它们是“对象”。它们不是类型,它们是实例。

您可以查看它们是如何定义的on cppreference

例子:

extern std::istream cin;
extern std::wistream wcin;

如您所见,cin 是一个类型为std::istream 的变量。

关于你对std::string 的假设:再次,cppreference is very helpful

我们可以看到std::string 不是变量/对象,而是std::basic_string<char> 的类型别名。

【讨论】:

  • 还在你的回答中说明他对string 的假设。
猜你喜欢
  • 2017-06-02
  • 2021-12-15
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
相关资源
最近更新 更多