我们不能只使用c ++中的对象变量吗?

时间:2019-11-18 08:01:25

标签: c++ object pointers variables reference

使用Java进行编码时,我们可以拥有未分配给任何对象的参考变量。 范例: Player p1 这里p1仅在我们创建如下对象时才被分配: p1 = new Player(); p1在这里存储新创建的Player对象的地址。

如果我们像这样在c ++中创建一个变量,它也在创建一个新对象。 范例: Player p2 p2在这里分配给一个新对象。这样一来,我们就不能只拥有某种类型的任何变量。

我们还可以如下创建指向该对象的指针, Player* p3 = new Player(); 如果两个(p2和p3)都持有地址,

i)该类型的指针(p3)有什么用途?

ii)我们如何才能创建类型的变量?

3 个答案:

答案 0 :(得分:2)

p2没有地址。它在变量本身中包含实际对象。

答案 1 :(得分:0)

您应该阅读有关指针,引用类型以及变量类型的更多信息。 例如:

  

玩家* p1 = new Player();

     

Player&p2; //我们稍后可能会设置p2 = p1。

p1是一个等于地址的指针。 p2是播放器的参考类型。它不会创建新对象。

答案 2 :(得分:0)

您能模仿到Java的最接近的东西(但请参见下面的shared_ptr):

std::shared_ptr<Player> p;
assert(not p);  // Assertion holds!
p = std::make_shared<Player>();
assert(p);  // Assertion holds!

大致相当于:

Player* p = nullptr;
p = new Player;
// ...
delete p;

但这是手动内存管理,这很容易出错。不要这样做!

如果您没有指向对象的指针,而只有对象本身(在C ++术语中为 value ),则您将失去空状态。

Player p;

p是对象本身。那条线将创建对象,并且无法围绕它。之前没有间接方法可以使您有机会代表“不存在任何物体”。您可以根据需要添加一个空状态:

std::optional<Player> p;  // since C++17, before use boost::optional
assert(not p); // holds
p = Player();
assert(p); // holds

关于shared_ptr的注释。真正的共享所有权实际上很少见。通常,您拥有(并希望拥有)分配的对象的恰好一个所有者。因此,在大多数情况下,您需要unique_ptr(如果您完全需要一个指针):

std::unique_ptr<Player> p;
assert(not p);  // holds
p = std::make_unique<Player>();
assert(p); // holds