[英]What is exactly an object in C++?
在我学习C ++的旅程开始时,我认为一个对象是一个仅与OOP相关的术语。 然而,我学的越多,我读的越多,我就会发现情况并非如此,我可以发现“对象”一词具有更广义的含义。 我在网上看了很多材料,但我还没找到清楚/坚实的东西。 可能是我无法到达正确的地方。 我可以得到标准,它有很好的段落,但你可能知道标准语言有点困难。 而且信息通常太分散了。
我的问题:请您用简单的英语向我展示OOP世界之外的C ++中的对象是什么? 或者至少指出我在哪里可以找到一些好的,具体的,简单易懂的。
如果你downvote请留下评论。 这也是学习的源泉
C++11
标准非常清楚:
1.8 C ++对象模型[ intro.object ]
对象是存储区域。 [注意:函数不是对象,无论它是否以对象的方式占用存储。 - 结束说明]
而已。 对象是可以存储数据的一块内存。
如果你想到它OO或O bject O rientation更有意义,当你意识到在过去,程序是围绕对象(或数据)操作的函数组织的。
术语“对象”在面向对象之前很久 。
面向对象的做法是将程序组织从围绕功能组织变为围绕数据本身组织 - 对象 。
因此,术语面向对象 。
范式的变化 。
在这里,我们看到了旧时代的范式转变:
struct my_object
{
int i;
char s[20];
};
void function(my_object* o)
{
// function operates on the object (procedural / procedure oriented)
}
我们现在拥有的:
struct my_object
{
void function()
{
// object operates on itself (Object Oriented)
}
int i;
char s[20];
};
来自https://timsong-cpp.github.io/cppwp/n3337/intro.object
对象是存储区域。
在传统的OOP和OOD中,Object有时用于描述对象类,有时用于描述类的实例。
在C ++中, class
和struct
代表类。
C ++中的对象可以是class
或struct
的实例,但它也可以是基本类型的实例。
一些简单的例子:
int i;
i
是一个对象。 它与程序可以使用的存储区域相关联。
struct foo { int a; int b;};
foo f;
f
也是一个对象。 它还与程序可以使用的存储区域相关联。
int* ptr = new int[200];
ptr
是一个指向int
类型的200个对象的指针。 这些对象还与程序可以使用的存储区域相关联。
不要抨击现有的答案,但他们错过了一个元素(可以说是标准缺陷)。
对象是存储区域。 [ 注意:函数不是对象,无论它是否以对象的方式占用存储。 - 结束说明 ]
在需要时,通过定义 ([basic.def]), new-expression ([expr.new])或实现([class.temporary])创建对象。
创建对象时确定对象的属性。
对象是存储区域, 其中已经进行了构造 。 实际上,大多数时候“对象”指的是具有其值和状态的构造实体,而“存储”仅指其所写的内存(或其他)。
差异可以是一个简单的细节:
// `s` names an object that has been constructed... somewhere.
// That storage will live exactly as long as necessary to back `s`
// as long as the object exists -- no need to worry about it.
std::string s = "hello";
// Using the object
std::cout << s << '\n';
但是你也可以(虽然它很少有用)将对象的生命周期与其存储的生命周期分开:
// `storage` points at a chunk of... storage.
// It hasn't been initialized, nor does it have a type.
void *storage = malloc(sizeof(std::string));
// Now we constructed an `std::string`:
// we have an actual object inhabiting the storage!
std::string *s = new (storage) std::string("hello");
// Using the object, through the pointer we have
std::cout << *s << '\n';
// Now we destruct the object: it exists no more.
s->~basic_string();
// Now we destroy the storage.
free(storage);
我必须强调,最后一个例子仅用于演示目的。 这是一种你可能不会遇到的技术,并且已在这里执行,没有任何错误检查。 不要在家尝试这个:)
现在,它与OOP“对象”有什么关系? 嗯......一点也不。 “对象”是一个非常通用的术语,OOP创始人也选择独立使用它。
参考c ++标准(N4618)的§1.8,一个对象:
在其建造期间 ,在其生命周期和破坏期间占据一个储存区域 ;
有一个生命周期 (对于非平凡的对象,它在初始化完成时启动,在析构函数启动时停止);
有一个存储持续时间 (静态,动态,线程或自动)
有一个类型 :唯一的对象类型 (严格别名)。
可能有一个名字
(其他答案已经详细说明了存储持续时间的含义。)
对象类型 (或类)是对象的唯一属性。 对象类型指定初始化对象占用的存储区域的含义。 所以意义是独一无二的,从哲学的角度来看, 对象类型是对象的种类,而不是它的种类。
对于编译器 ,它只约束可以应用于存储区域的操作集合:与对象类型相关联的方法(在这种情况下,类型由class
或struct
定义),以及将对象作为对象的所有函数一个参数(可见)。
对于程序员 ,该类型还指定了在对象的生命周期中对对象应用一系列操作的后果。 该类型包含的信息比编译器实际可能知道的要多得多。 例如,在检查了对象的大小( std::vector<int>
类型的an_obj
为0
,程序员知道an_obj.at(0)
将始终抛出,编译器可能不会。
在C ++世界中,对象是类的实例化。 它以某种方式表现(方法/功能),并具有描述其状态的属性(数据成员)。
对象具有生命周期。 它是通过构造函数创建的,它存在,并且它会死掉(通过析构函数)。
类就像一个蓝图,通过它可以定义对象的行为和属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.