在我学习C++的旅程开始时,我认为一个对象是一个仅与OOP相关的术语.但是,我学的越多,我阅读的越多,我就会发现情况并非如此,我可以发现"对象"一词具有更广泛的含义.我在网上看了很多材料,但我还没找到清楚/坚实的东西.可能是我无法到达正确的地方.我可以得到标准,它有很好的段落,但你可能知道标准语言有点困难.而且信息通常太分散了.
我的问题:请您用简单的英语向我展示OOP世界之外的C++中的对象是什么?或者至少指出我在哪里可以找到一些好的,具体的,简单易读的.
如果你downvote请留下评论.这也是学习的源泉
该C++11标准是相当清楚的:
1.8 C++对象模型[ intro.object ]
对象是存储区域.[注意:函数不是对象,无论它是否以对象的方式占用存储. - 结束说明]
而已.对象是可以存储数据的一块内存.
如果你仔细想想OO或Ø bject Ø rientation更有意义,当你意识到,在过去的计划是围绕在对象(或数据)操作的功能组织.
术语"对象" 在面向对象之前很久.
什么面向对象所做的是来自各地的功能正在组织各地的数据本身被组织更改程序组织- 对象.
因此,术语面向对象.
范式的变化.
在这里,我们看到了旧时代的范式转变:
struct my_object
{
int i;
char s[20];
};
void function(my_object* o)
{
// function operates on the object (procedural / procedure oriented)
}
Run Code Online (Sandbox Code Playgroud)
我们现在拥有的:
struct my_object
{
void function()
{
// object operates on itself (Object Oriented)
}
int i;
char s[20];
};
Run Code Online (Sandbox Code Playgroud)
来自https://timsong-cpp.github.io/cppwp/n3337/intro.object
对象是存储区域.
在传统的OOP和OOD中,Object有时用于描述对象类,有时用于描述类的实例.
在C++中,class和struct表示类.
C++中的对象可以是a class或a 的实例,struct但它也可以是基本类型的实例.
一些简单的例子:
int i;
Run Code Online (Sandbox Code Playgroud)
i是一个对象.它与程序可以使用的存储区域相关联.
struct foo { int a; int b;};
foo f;
Run Code Online (Sandbox Code Playgroud)
f也是一个对象.它还与程序可以使用的存储区域相关联.
int* ptr = new int[200];
Run Code Online (Sandbox Code Playgroud)
ptr是一个指向200个类型对象的指针int.这些对象还与程序可以使用的存储区域相关联.
不要抨击现有的答案,但他们错过了一个元素(可以说是标准缺陷).
一个对象是存储的区域.[ 注意:函数不是对象,无论它是否以对象的方式占用存储.- 结束说明 ]
在需要时,通过定义([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';
Run Code Online (Sandbox Code Playgroud)
但是你也可以(虽然它很少有用)将对象的生命周期与其存储的生命周期分开:
// `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);
Run Code Online (Sandbox Code Playgroud)
我必须强调,最后一个例子仅用于演示目的.这是一种你可能不会遇到的技术,并且已在这里执行,没有任何错误检查.不要在家尝试这个:)
现在,它与OOP"对象"有什么关系?嗯......一点也不."对象"是一个非常通用的术语,OOP创始人也选择独立使用它.
参考 c++ 标准 (N4618) 的 §1.8,一个对象:
在建造期间、整个生命周期和销毁期间占据一个存储区域;
有一个生命周期(对于非平凡的对象,它在初始化完成时开始,在析构函数开始时停止);
具有存储持续时间(静态、动态、线程或自动)
有一个类型:唯一的对象类型(严格别名)。
可能有名字
(其他答案已经详细说明了存储期限的含义。)
的对象类型(或类)是对象的一个独特的属性。所述对象类型指定存储区域的含义占领了初始化的对象。所以意义是唯一的,从哲学的角度来看,对象类型是对象的种类,而不是它的种类。
对于编译器,它只约束可以应用于存储区域的操作集合:与对象类型关联的方法(在这种情况下,类型由class或定义struct),以及所有将对象作为参数的函数(可见)。
对于程序员来说,类型还指定了在对象的生命周期内对对象应用一系列操作的结果。该类型包含的信息比编译器实际可能知道的要多得多。例如,在检查an_obj了类型std::vector<int>为的对象的大小之后0,程序员知道它an_obj.at(0)总是会抛出,而编译器可能不会。