什么是C ++中的对象?

时间:2017-05-12 21:54:24

标签: c++ object

在我学习C ++的旅程开始时,我认为一个对象是一个仅与OOP相关的术语。但是,我学的越多,我阅读的越多,我就会发现情况并非如此,我可以发现“" object"具有更广义的含义。我在网上看了很多材料,但我还没找到清楚/坚实的东西。可能是我无法到达正确的地方。我可以得到标准,它有很好的段落,但你可能知道标准语言有点困难。而且信息通常太分散了。

我的问题:请您用简单的英语向我展示 OOP世界之外的C ++中的对象是什么?或者至少指出我可以找到一些好的,具体的和易于阅读的内容对这个。

如果你是downvote请留下评论。这也是学习的来源

5 个答案:

答案 0 :(得分:7)

C++11标准非常明确:

  

1.8 C ++对象模型 [ intro.object ]

     

对象是存储区域。 [注意:函数不是对象,无论它是否以对象的方式占用存储。 - 结束说明]

那就是它。对象是可以存储数据的一块内存。

如果你想到它 OO O 那么 O 当你意识到在过去这些程序是有组织的时候会更有意义围绕对象(或数据)操作的函数。

术语"对象"在面向对象之前,它位于 long 周围。

面向对象所做的是将程序组织从围绕功能组织变为围绕数据本身进行组织 - 对象

因此,术语面向对象

范式的改变

在这里,我们看到了旧时代的范式转变:

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];
};

答案 1 :(得分:6)

简短回答

来自https://timsong-cpp.github.io/cppwp/n3337/intro.object

  

对象是存储区域。

答案略长

在传统的OOP和OOD中,Object有时用于描述对象类,有时用于描述类的实例。

在C ++中,classstruct代表类。

C ++中的对象可以是classstruct的实例,但它也可以是基本类型的实例。

一些简单的例子:

int i;

i是一个对象。它与程序可以使用的存储区域相关联。

struct foo { int a; int b;};
foo f;

f也是一个对象。它还与程序可以使用的存储区域相关联。

int* ptr = new int[200];

ptr是指向200个int类型对象的指针。这些对象还与程序可以使用的存储区域相关联。

答案 2 :(得分:6)

不要抨击现有答案,但他们错过了一个元素(这可能是一个标准缺陷)。

  

对象是存储区域。 [注意:函数不是对象,无论它是否以对象的方式占用存储。 - 结束记录]

     

对象由定义([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&#34;对象&#34;?有什么关系?嗯......一点也不。 &#34;对象&#34;是非常通用术语,OOP创始人也选择独立使用它。

答案 3 :(得分:4)

参考c ++标准(N4618)的§1.8,一个对象:

  1. 构建期期间占据存储空间,通过生命周期及其销毁期< / em>的;

  2. 有一个生命周期(对于非常重要的对象,它在初始化完成时启动,在析构函数启动时停止);

  3. 存储时间(静态,动态,线程或自动)

  4. 有一个类型对象类型,它是唯一的(严格别名)。

  5. 名称

  6. 关于对象类型

    (其他答案已经详细说明了存储时间的含义。)

    对象类型(或类)是对象的唯一属性。 对象类型指定初始化对象占用的存储区域的含义。所以意义是独一无二的,从哲学的角度来看,对象类型是对象的种类,而不是它的种类。

    对于编译器,它只约束可应用于存储区域的操作集合:与对象类型关联的方法(在这种情况下,类型由{{1定义) }}或class),以及将对象作为参数(可见)的所有函数。

    对于程序员,该类型还指定在生命周期期间对对象应用一系列操作的后果。该类型包含的信息比编译器实际可能知道的要多得多。例如,在检查了struct类型an_obj的对象大小std::vector<int>之后,程序员知道0将始终抛出,编译器可能不会。< / p>

答案 4 :(得分:-3)

在C ++世界中,对象是类的实例化。它以某种方式表现(方法/功能),并具有描述其状态的属性(数据成员)。

对象具有生命周期。它是通过构造函数创建的,它存在,并且它会死掉(通过析构函数)。

类就像一个蓝图,通过它可以定义对象的行为和属性。