我的问题:请用简单的英语告诉我,除了面向对象编程之外,在C++中什么是对象?
C++11
标准非常明确:
1.8 C++对象模型 [ intro.object ]
对象是存储区域。[注意:函数不是对象,无论它是否以对象的方式占用存储空间。—注释结束]
就是这样。对象是一块内存,可以存储数据。
如果你思考一下面向对象或Object Orientation,你会发现在旧时代,程序是围绕着操作对象(或数据)的函数组织的,所以更有意义。
术语“对象”早在面向对象之前就已经存在了。
面向对象所做的是将程序组织从围绕函数转变为围绕数据本身——对象。
因此出现了术语面向对象。
范式变化。
在这里,我们看到了从旧时代开始的范式转变:
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];
};
malloc
分配的存储区域视为一个对象。也许不是特别有用的对象,但您仍然可以像处理其他对象一样处理它。 void *
和myclass *
之间唯一的区别在于myclass *
具有我可以使用的有用内容。我仍然可以以相同的方式处理内存块,但可能无法以面向对象的方式进行。 - user820304根据https://timsong-cpp.github.io/cppwp/n3337/intro.object,一个对象是存储区域。
在传统的面向对象编程(OOP)和面向对象设计(OOD)中,对象有时用于描述对象类,有时用于描述类的实例。
在C++中,class
和struct
表示类。
C++中的对象可以是class
或struct
的实例,也可以是基本类型的实例。
以下是一些简单的示例:
int i;
i
是一个对象。它与程序可以使用的存储区域相关联。
struct foo { int a; int b;};
foo f;
f
是一个对象。它也与可以被程序使用的存储区域相关联。
int* ptr = new int[200];
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';
但是你也可以(虽然这很少有用)将对象的生命周期与其存储的生命周期分开:
// `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的创始人们只是选择了同样的术语,独立使用它。
int n;
,n
不是一个对象。 - user2100815int
。对于可平凡构造类型,构造不意味着初始化 :) - Quentin参考C++标准(N4618)的§1.8,一个对象:
在其构造期、生命周期和销毁期期间占用一段存储区域;
有一个生命周期(对于非平凡对象,它从初始化完成时开始,到析构函数开始时结束);
具有存储期(静态、动态、线程或自动);
有一个类型:唯一的对象类型(严格别名)。
可能有一个名称。
(其他答案已经详细说明了存储期的含义。)
对象类型(或类)是对象的一个独特属性。 对象类型指定了由初始化对象占用的存储区域的含义。因此,从哲学的角度来看,这个含义是独一无二的,对象类型是对象的种类而不是类型。
对于编译器,它只约束可以应用于存储区域的操作集合:与对象类型相关联的方法(在这种情况下,类型由class
或struct
定义)以及所有将对象作为参数的函数(可见)。
对于程序员,类型还指定了在对象的生命周期内对对象应用一系列操作的后果将是什么。类型包含比编译器实际能够知道的信息要多得多。例如,在检查类型为std::vector<int>
的对象an_obj
的大小为0
之后,程序员知道an_obj.at(0)
将始终引发异常,但编译器可能不知道。
int
就是一个对象。 - Quentin