C ++构造函数参数问题

时间:2010-06-04 14:37:28

标签: c++ oop pointers constructor const

我正在学习C ++。我有一个名为GameContext的简单类:

class GameContext {
    public:
        GameContext(World world);
        virtual ~GameContext();
};

要初始化GameContext对象,我需要一个World对象。

  • GameContext构造器是否应将指针带到World对象(World*),World对象的地址(&World)或参考到世界对象(世界)?

  • 在参数附近使用时,const关键字是什么?例如:GameContext(const World &world)

感谢。

7 个答案:

答案 0 :(得分:6)

首先,teminology:你是对的World *是指向World对象的指针。但是,World &将是对World对象的引用。 World将是World对象的副本,而不是对它的引用。

const(主要用于指针或引用,如World const &worldWorld 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对象,则应添加constconst World& worldconst 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是采用常量引用而不是获取值。当参数是一个对象(而不是像intbool这样的基本类型)时,这比取值更有效,因为在这种情况下不会复制。但是const阻止函数修改引用的参数,因此对于调用者来说,它与引用无关。