这两个实例有什么区别?

时间:2013-08-14 11:32:20

标签: c++ constructor operator-overloading instance

我有这个构造函数:

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)

2 个答案:

答案 0 :(得分:3)

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

BaseState* temp = new BaseState(*primary);

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

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

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

BaseState primary;

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

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

BaseState temp = primary;

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

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

答案 1 :(得分:1)

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

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