Java程序员想要理解C++代码:使用没有new的对象的方法

zel*_*ell -2 c++ malloc new-operator

我多年来一直在使用Java.现在我需要了解一个C++程序.

TimeStamp theTimeStamp;
theTimeStamp.update();
Run Code Online (Sandbox Code Playgroud)

令我困惑的是为什么我们不写

TimeStamp theTimeStamp = new(); 
Run Code Online (Sandbox Code Playgroud)

我的直觉是,要使用对象,应首先分配内存空间并将其与对象关联.

我想这是Java和C++从根本上有所不同的一点?你能澄清一下吗?

[EDIED]我写了'TimeStamp theTimeStamp = malloc();'

cod*_*ing 6

你永远不会用TimeStamp theTimeStamp = malloc();C++ 写.

首先,因为malloc来自C并且实际上不应该在C++中使用.其次,它不知道它的上下文,需要一个参数来指定它必须分配多少内存,并返回一个你需要转换的无类型指针.

相反,你就是写作

TimeStamp * theTimeStamp = new TimeStamp();
Run Code Online (Sandbox Code Playgroud)

请参阅 - 这与Java非常相似.请注意*那里?这是指定它theTimeStamp是一个指针(在Java中,用户定义类型的每个变量都是一个指针/引用,因此您不必关心明确说明这一点).

但是,在C++中,您可以选择是否需要

  • C++使用变量作用域自动处理创建和销毁(即,没有*,如第一个代码示例中所做的那样).但这意味着,一旦theTimeStamp超出范围(即通常在定义变量的块的末尾),变量将自动销毁.
  • 或者如果你想自己做动态内存分配(Java中的默认情况) - 但与Java相比,你还必须关心在C++中自己删除对象.

这必须注意"手动"删除是为什么在C++中通常不直接使用这样的原始指针,而是所谓的智能指针类型,例如std::shared_ptr来自新的C++ 11标准.他们为您免除了必须手动删除的苦差事(在很多情况下可能会忘记它).还有其他智能指针类型; 该shared_ptr然而,提供最接近的相似什么Java那样-你可以指定一个shared_ptr到另一个,从而保持它指向活着的对象,只有当最后一个共享指针的指向对象的被破坏,会指向的对象也销毁.

无论何时你都可以,但在C++中最好不要使用指针,而是使用自动分配的变量.