为什么通过引用调用会创建一个新实例?

ata*_*man 8 c++ qt const-reference

foo通过const ref以下方式调用方法:

// method, which is being called
void foo(const Entity & ent);

// call
Entity* e = new Entity;
foo(e);    // wrong: missing * but compiles
Run Code Online (Sandbox Code Playgroud)

这段代码不仅编译,而且还创建了一个新的实例,Entity其默认值在范围内foo.我希望这不会编译或至少崩溃.

如果我把foo正确的(foo(*e)),一切工作为疑似,我看到的正确的价值观Entityfoo.

我使用Qt 4.7提供的mingw.

这是以下界面Entity:

class Entity : public QObject
{
    Q_OBJECT

public:
    Entity (QObject* parent = NULL);

    long getId() const { return this->id; }
    void setId(const long id) { this->id = id; }

    QString getName() const { return this->name; }
    void setName(const QString & name) {this->name = name; }

private:
    QString name;
    long id;
};
Run Code Online (Sandbox Code Playgroud)

Mar*_*k B 15

[编辑]你有一个隐式转换构造函数(恰好是一个默认构造函数)从Entity*(通过父级QObject*)到Entity它,它被用来创建一个临时实例传入.

出于这个原因,我总是建议默认情况下使所有单参数可调用构造函数(例如,除了一个参数之外的所有参数都是默认的)显式并避免隐式转换运算符,除非它们完全执行在所有情况下预期的转换语义.在其他情况下,通过显式方法使转换可用.

有时隐式转换很有用,每个转换都应根据具体情况进行评估.

  • +1.请注意,"单参数构造函数"包括那些由于默认值而可以使用一个参数调用的多参数构造函数. (2认同)