为什么像cin,cout,string等东西被认为是对象?

时间:2016-03-09 16:31:42

标签: c++ c++11

根据我的理解(以及我的教科书所说的),对象是一个自包含的编程元素,它保存数据和对该数据执行操作的过程。有了这个说,为什么像cin,cout,string等东西被认为是对象? cin是一个对象,就像我定义的那样? cin是一个自包含单元的名称,它包含数据和一个对该数据执行操作的过程,可以在iostream头文件的源代码中找到?

2 个答案:

答案 0 :(得分:11)

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

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

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

C ++11§1.8/ 1
  

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

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

std::string不是对象,它是一种类型。

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

答案 1 :(得分:1)

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

您可以看到它们的定义方式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>的类型别名。