繁体   English   中英

C ++传递对象的副本与将指针传递给对象?

[英]C++ Passing a Copy of an Object vs. Passing a Pointer to an Object?

这是我的Game类的构造函数:

// Construct a Game to be played with player on a copy of the board b.
Game(const Board& b, Player* player)
{
  ...
}

这是我使用构造函数的方式:

Player p("Player Name");
Board b(6,3);
Game g(b, &p);

这是如何运作的? 被复制了吗?

如果我想保存指向播放器的指针,我应该创建如下的私有ivar吗?

private:
  Player* _player;

...
// In Game constructor
_player = player;

如果通过引用或指针传递,则不会进行复制。 如果你想保存一个指针,那么是的,你需要一个地方来保存它。

请注意,通常使用构造函数初始化列表而不是赋值更好。 喜欢:

Game( const Board& b, Player * player ) : _player( player )
{
    // do something with Board
}

至:

Game( const Board& b, Player * player )
{
    _player = player;
    // do something with Board
}

对于指针,没有太大的区别,但对于更复杂的对象,使用初始化可以避免分配时可能出现的语义和性能问题。

如前所述,参数不会被复制,因为它通过引用传递。
但我想指出一些风格问题。

不要混淆你的风格。 没有玩家可以玩游戏吗? 如果不是,请通过参考传递玩家。

另一种组合。 一个参数作为整个单词传递,另一个参数作为一个字母传递。

Game(const Board& board, Player& player):
    _player(player)    
{
  ...
}

private:
  Player& _player;

并且可能你会想要存储董事会,因为它是有道理的。 游戏可以“了解”董事会。

private:
    const Board& _board;

然后你的构造函数将是

Game(const Board& board, Player& player):
    _board(board),
    _player(player)
{
  ...
}

您是通过引用传递板,所以不,它没有被复制。

如果你以后有一些代码,比如:

Board _privateBoard = b;

然后你正在复制b 但它没有被复制到函数中。

至于你的问题,是的,你需要将指针存储在某个地方,如果你想把它拿回来的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM