使用Java进行编码时,我们可以拥有未分配给任何对象的参考变量。
范例:
Player p1
这里p1仅在我们创建如下对象时才被分配:
p1 = new Player();
p1在这里存储新创建的Player对象的地址。
如果我们像这样在c ++中创建一个变量,它也在创建一个新对象。
范例:
Player p2
p2在这里分配给一个新对象。这样一来,我们就不能只拥有某种类型的任何变量。
我们还可以如下创建指向该对象的指针,
Player* p3 = new Player();
如果两个(p2和p3)都持有地址,
i)该类型的指针(p3)有什么用途?
ii)我们如何才能创建类型的变量?
答案 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