这两个例子有什么不同

What is the difference between these two instances?

本文关键字:什么 两个      更新时间:2023-10-16

我有这个构造函数:

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;
}

并且我创建了类似于BaseState* primary = new BaseState(0)的实例primary

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

BaseState* temp = new BaseState(*primary);

它将动态地分配一个对象并用复制构造函数初始化它。

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

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

BaseState primary;

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

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

BaseState temp = primary;

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

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

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

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