C++ Can';t在c+中,只有对象的变量+;?

C++ Can';t在c+中,只有对象的变量+;?,c++,object,pointers,variables,reference,C++,Object,Pointers,Variables,Reference,当我们使用java进行编码时,我们可以使用未分配给任何对象的引用变量。 例子: 播放器p1 此处,仅当我们创建如下对象时,才会指定p1: p1=新玩家() 这里p1存储新创建的播放器对象的地址 如果我们在C++中创建一个变量,像这样,它也在创建一个新对象。 例子: 播放器p2 p2在此指定给一个新对象。这样,我们就不能只拥有某种类型的变量 我们还可以创建指向对象的指针,如下所示, Player*p3=新玩家() 如果两个(p2和p3)都持有地址 i) 这种类型的指针(p3)有什么用途 ii)我们

当我们使用java进行编码时,我们可以使用未分配给任何对象的引用变量。 例子:
播放器p1
此处,仅当我们创建如下对象时,才会指定p1:
p1=新玩家()
这里p1存储新创建的播放器对象的地址

如果我们在C++中创建一个变量,像这样,它也在创建一个新对象。 例子:

播放器p2
p2在此指定给一个新对象。这样,我们就不能只拥有某种类型的变量

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

i) 这种类型的指针(p3)有什么用途


ii)我们如何创建一个类型的变量?

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

p2
不包含地址。它包含变量本身中的实际对象。

最接近于模仿Java的功能是(但请参见下面关于共享的内容):

但这是手动内存管理,非常容易出错。别这样

如果你没有指向一个对象的指针,而只是一个对象本身(C++术语中的一个值),那么你就失去了空状态。p>

Player p;
p
是对象本身。这条线创建了一个对象,但没有办法绕过它。没有一种间接的方式能让你有机会表现出“没有对象在场”。如果需要,可以重新添加空状态:

std::optional<Player> p;  // since C++17, before use boost::optional
assert(not p); // holds
p = Player();
assert(p); // holds
std::可选p;//从C++17开始,在使用boost::optional之前
断言(不是p);//持有
p=玩家();
断言(p);//持有
关于共享ptr的说明。真正的共享所有权实际上相当罕见。通常,对于一个分配的对象,您只有(并且希望)一个所有者。因此,在大多数情况下,您需要唯一的\u ptr(如果您想要一个指针):

std::unique\u ptr p;
断言(不是p);//持有
p=std::使_唯一();
断言(p);//持有

最接近于模仿Java的功能是(但请参见下面关于共享的内容):

但这是手动内存管理,非常容易出错。别这样

如果你没有指向一个对象的指针,而只是一个对象本身(C++术语中的一个值),那么你就失去了空状态。p>

Player p;
p
是对象本身。这条线创建了一个对象,但没有办法绕过它。没有一种间接的方式能让你有机会表现出“没有对象在场”。如果需要,可以重新添加空状态:

std::optional<Player> p;  // since C++17, before use boost::optional
assert(not p); // holds
p = Player();
assert(p); // holds
std::可选p;//从C++17开始,在使用boost::optional之前
断言(不是p);//持有
p=玩家();
断言(p);//持有
关于共享ptr的说明。真正的共享所有权实际上相当罕见。通常,对于一个分配的对象,您只有(并且希望)一个所有者。因此,在大多数情况下,您需要唯一的\u ptr(如果您想要一个指针):

std::unique\u ptr p;
断言(不是p);//持有
p=std::使_唯一();
断言(p);//持有

如果两个(p2和p3)都持有地址。。。他们不是
p2
是类型为Player的对象。
p2
不包含对象的地址。它保存堆栈上对象的完整数据。这是否回答了您的问题播放器P1 < /C> >非常松散,就像C++中的代码>播放器*P1<代码>。但是,这不是1到1的等价,如果不想太多的Java,那么学习C++中的指针和引用是明智的。C++中java对象最接近的是 STD::Syrdjava PTR 。他们不是
p2
是类型为Player的对象。
p2
不包含对象的地址。它保存堆栈上对象的完整数据。这是否回答了您的问题播放器P1 < /C> >非常松散,就像C++中的代码>播放器*P1<代码>。但是,这不是1到1的等价,在C++中学习指针和引用是明智的,而不需要太多的思考java。C++中java对象最接近的是 STD::SyrdYPPTR 。
std::unique_ptr<Player> p;
assert(not p);  // holds
p = std::make_unique<Player>();
assert(p); // holds