1

我有这个构造函数:

BaseState::BaseState(const BaseState& s) {
    id = s.id;
    acceptance = s.acceptance;
}

和这个重载的运算符

BaseState& BaseState::operator=(const BaseState& s) {
    acceptance = s.acceptance;
    id = s.id;
    return *this;
}

所以我的问题如下:创建一个像

//primary is a BaseState defined previously    
BaseState* temp = new BaseState(primary);

或者

BaseState* temp = primary;

应该是一样的,还是有什么区别?

编辑:primary是一个指针我也有这个构造函数:

BaseState::BaseState(Id v) {
    id = v;
    acceptance = false;
}

我创建了我的实例primary,例如BaseState* primary = new BaseState(0).

4

2 回答 2

3

如果primary是一个指针(正如您的评论所建议的那样),那么第一个将不会编译(除非您没有向我们展示一个带有指针参数的构造函数)。也许你的意思是:

BaseState* temp = new BaseState(*primary);

这将动态分配一个对象并使用复制构造函数对其进行初始化。

第二个将创建指向同一对象的第二个指针,并且不会创建另一个对象。

如果primary是一个对象,而不是一个指针:

BaseState primary;

第一个将动态分配一个对象,并使用复制构造函数对其进行初始化。您必须记住在完成对象后删除它(或者,更好的是,使用智能指针来执行此操作,或者new完全避免)以避免内存泄漏。

第二个不会编译(除非有一个转换运算符将对象转换为指针,但这会很奇怪)。但以下将:

BaseState temp = primary;

这将在当前范围内分配一个对象,同时使用复制构造函数对其进行初始化。这将在超出范围时自动释放(或者在程序结束时,如果它在命名空间范围内)。你应该更喜欢这个new,除非你真的需要一个动态的生命周期。

在这两种情况下都不会使用赋值运算符。初始化不是赋值,即使它确实使用了=令牌。

于 2013-08-14T11:49:33.630 回答
1

new操作员将调用复制构造函数。指针的赋值不会调用赋值运算符。

所以,在这个例子中,第一个单行创建一个新对象作为第一个的副本。第二个单线(假设primary这里是另一种类型 - 指针而不是对象,否则代码将无法编译或者您需要定义更多赋值运算符)创建另一个指向同一对象的指针。

于 2013-08-14T11:33:43.920 回答