我正在学习C ++。我有一个名为GameContext的简单类:
class GameContext {
public:
GameContext(World world);
virtual ~GameContext();
};
要初始化GameContext
对象,我需要一个World
对象。
GameContext构造器是否应将指针带到World对象(World*
),World对象的地址(&World
)或参考到世界对象(世界)?
在参数附近使用时,const
关键字是什么?例如:GameContext(const World &world)
感谢。
答案 0 :(得分:6)
首先,teminology:你是对的World *
是指向World对象的指针。但是,World &
将是对World对象的引用。 World
将是World对象的副本,而不是对它的引用。
const
(主要用于指针或引用,如World const &world
或World const *world
)意味着您正在获取一个指向const对象的引用/指针 - 在其他单词,你不允许修改它引用/指向的原始对象。
对于小对象,通常需要传递副本。对于大型对象,通常需要传递const引用。这有例外,但这是一个合理的经验法则,直到你已经学到了足够多知道何时违反规则(可以这么说)。
根据名称,我猜你的World对象可能足够大,你可能想通过const引用传递它,所以你的ctor应该是这样的:
GameContext(World const &world);
答案 1 :(得分:4)
理想情况下,您应接受对const
的{{1}}引用:
World
首先,传递class GameContext {
public:
GameContext(const World& world);
virtual ~GameContext();
};
时不会发生复制。其次,world
是关键字,表示在这种情况下您不会更改传递的const
参数。
答案 2 :(得分:1)
你的术语已经过时了。
在C ++术语中,术语指针和地址是同义词(就我们所说的值而言)。为了获取指针(或地址),您必须将参数声明为World* world
。
要获取参考,参数应声明为World& world
。
要获取复制的值,参数应声明为World world
。
在每种特定情况下应使用哪种声明取决于我们的意图。假设World
是一个非平凡的对象,通常应该将选择限制为引用World& world
或指针World* world
。
如果您不打算在World
的构造函数中修改源GameContext
对象,则应添加const
:const World& world
或const World* world
最后,通过指针传递允许您传递“保留”值 - 空指针 - 但同时阻止您将指针传递给非左值。如果这对您来说无关紧要,那么您应该坚持使用引用const World& world
。
答案 3 :(得分:1)
World
不是对World
对象的引用 - 编译器正在复制结构并将其传递给堆栈。这很糟糕。
指针(World*
)和引用(World&
)非常相似,它们的区别仅在于语法(->
vs .
)和范围(你可以'如果您使用引用,则成员m_pWorld
在GameContext的生命周期内不能指向另一个世界 - 但如果您使用指针,则可以执行此操作。如果你总是使用相同的世界(可能)或其他指针,我的建议是获得参考。
const
告诉编译器你不会修改对象。当您获得对象的引用时,您正在处理 对象,而不是它的副本 - 因此您在方法中修改的任何内容实际上都会修改“外部”对象。在您的情况下,由于您可能会在World
内对GameContext
进行修改或操作,因此您可能需要非const引用。
所以你应该做这样的事情
class GameContext
{
public:
GameContext (World& pWorld) : m_pWorld(pWorld)
{
}
virtual ~GameContext () { ... }
void foo (int nParam)
{
m_pWorld.bar(nParam);
}
private:
World& m_pWorld;
};
答案 4 :(得分:0)
引用比指针更安全,不涉及副本。至于const关键字,请阅读我之前提出的这个问题的答案:How many and which are the uses of "const" in C++?
答案 5 :(得分:0)
const
表示方法GameContext
无法修改参数world
答案 6 :(得分:0)
GameContext应该构建吗? 获取指向World对象的指针 (世界*),世界的地址 对象(& World)或对a的引用 世界对象(世界)?
首先,“World
对象的地址”与指向World
对象的指针相同。指针是一种存储对象地址的变量。如果传递地址,那么与您传递的地址对应的参数将是指针。
是否要使用指针取决于World
类的语义。如果你取一个值(而不是一个指针),那么你将收到传入的World对象的副本。如果GameContext
对象以外的东西需要对它执行操作< em>相同的世界对象,然后您将要传入并存储指针。如果没有必要,或者World
类在内部运行,使World
对象的所有副本都使用一组公共数据,那么您可以按值传递。
使用时const参数是什么 靠近参数?例如: GameContext(const World&amp; world)
const
表示“无法修改”,就像它在任何其他地方一样。正如您在示例中给出的,C ++中常见的idom是采用常量引用而不是获取值。当参数是一个对象(而不是像int
或bool
这样的基本类型)时,这比取值更有效,因为在这种情况下不会复制。但是const
阻止函数修改引用的参数,因此对于调用者来说,它与引用无关。