2

JavaObject有一些方法,如toString, hashCode,equals等。C++ 中的对象是否有一些内置方法?C++ 和 Java 中的对象之间的实际区别是什么?

4

4 回答 4

8

Java 和 C++ 中的工作方式不同。

  • 在 Java 中,每个对象都继承自类Object。这是一个提供一些基本成员函数的基类ToString(),可以被子类覆盖。

  • 在 C++ 中没有像Object. 事实上,C++ 中的对象一词指的是任何类型,包括非类类型。
    新的 C++11 标准提供了一个标准函数std::to_string,该函数对任何对象都有效,前提是它存在有效的重载。
    std::to_stringhttp
    std::hash : //en.cppreference.com/w/cpp/string/basic_string/to_string :http: //en.cppreference.com/w/cpp/utility/hash
    也可以通过定义任何类型之间的相等性operator==

这展示了两种语言之间的不同设计选择。虽然 Java 更面向对象(基类提供功能),但 C++ 标准库使用通用编程范式(可应用于各种类型的算法)。

于 2012-09-23T10:39:09.110 回答
2

在 C++ 中,您只需为使用的内容付费。因此,默认 C++ 对象没有超类,并且除了默认构造函数、复制构造函数、赋值运算符和析构函数之外没有预定义的方法。

同样,成员方法默认不是多态的:

class A { void foo(){ cout << "Hello from A\n"; } };
class B : public A { void foo(){ cout << "Hello from B\n";}};

...
unique_ptr<A> a= new B();
a->foo(); // will print Hello from A since a is an A*

您需要使用关键字声明方法多态virtual

class A { virtual void bar(){ cout << "Hello from A\n"; } };
class B { virtual void bar(){ cout << "BBBB\n";}};

unique_ptr<A> a=new B();
a->bar(); // will print "BBBB": indirection through virtual function table.

类也有析构函数;对象的生命周期不受其用户/垃圾收集的限制,而是受其可见性的限制:任何代码不再可见的变量会立即被清除。

对象也可以通过使用在免费存储中创建new,在这种情况下,需要使用 显式释放它们delete

于 2012-09-23T10:37:50.037 回答
1

根据 Andrew Koenig 的《Accelerated C++ 》一书,C++中的“对象”一词可以定义为“存在于内存中的东西”。这同样适用于基本/原始类型的变量,以及指针、函数指针、实例对象、数组等。无论该内存是在堆栈上自动分配还是在堆上动态/手动分配,这也是正确的。

这与 Java 中同一个词的定义非常不同,JavaObject中指的是所有类的最终基础,而“对象”一词的定义是“类的实例”;因此总是指在堆上分配的东西。

正如其他答案指出的那样,C++ 没有任何内置类型或最终基类,称为Object.

于 2012-09-23T10:52:27.540 回答
0

方法toString()hashCode()等不是Java对象的标准方法,这些是类的公共方法Object(Java Env的最上层类)。由于每个类默认扩展Object,我们在每个对象中都有这些方法。

但是在 C++ 中,我们没有像Object在 java 中那样的任何超级类,所以我们没有像这样的任何标准方法。

于 2012-09-23T10:28:29.913 回答