JavaObject
有一些方法,如toString
, hashCode
,equals
等。C++ 中的对象是否有一些内置方法?C++ 和 Java 中的对象之间的实际区别是什么?
4 回答
Java 和 C++ 中的工作方式不同。
在 Java 中,每个对象都继承自类
Object
。这是一个提供一些基本成员函数的基类ToString()
,可以被子类覆盖。在 C++ 中没有像
Object
. 事实上,C++ 中的对象一词指的是任何类型,包括非类类型。
新的 C++11 标准提供了一个标准函数std::to_string
,该函数对任何对象都有效,前提是它存在有效的重载。
std::to_string
:http
std::hash
: //en.cppreference.com/w/cpp/string/basic_string/to_string :http: //en.cppreference.com/w/cpp/utility/hash
也可以通过定义任何类型之间的相等性operator==
这展示了两种语言之间的不同设计选择。虽然 Java 更面向对象(基类提供功能),但 C++ 标准库使用通用编程范式(可应用于各种类型的算法)。
在 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
。
根据 Andrew Koenig 的《Accelerated C++ 》一书,C++中的“对象”一词可以定义为“存在于内存中的东西”。这同样适用于基本/原始类型的变量,以及指针、函数指针、实例对象、数组等。无论该内存是在堆栈上自动分配还是在堆上动态/手动分配,这也是正确的。
这与 Java 中同一个词的定义非常不同,JavaObject
中指的是所有类的最终基础,而“对象”一词的定义是“类的实例”;因此总是指在堆上分配的东西。
正如其他答案指出的那样,C++ 没有任何内置类型或最终基类,称为Object
.
方法toString()
,hashCode()
等不是Java对象的标准方法,这些是类的公共方法Object
(Java Env的最上层类)。由于每个类默认扩展Object
,我们在每个对象中都有这些方法。
但是在 C++ 中,我们没有像Object
在 java 中那样的任何超级类,所以我们没有像这样的任何标准方法。