我有这个构造函数:
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)
。
答案 0 :(得分:3)
如果primary
是一个指针(正如你的注释所示),那么第一个将不会编译(除非有一个构造函数你没有向我们展示带有指针参数)。也许你的意思是:
BaseState* temp = new BaseState(*primary);
将动态分配一个对象,并使用复制构造函数初始化它。
第二个将创建指向同一对象的第二个指针,并且不会创建另一个对象。
如果primary
是一个对象,而不是一个指针:
BaseState primary;
第一个将动态分配一个对象,并使用复制构造函数初始化它。您必须记住在完成对象后删除对象(或者,更好的是,使用智能指针来完成此操作,或完全避免使用new
)以避免泄漏内存。
第二个不会编译(除非有一个转换运算符将对象转换为指针,但这很奇怪)。但以下是:
BaseState temp = primary;
这将在当前作用域中分配一个对象,并使用复制构造函数对其进行初始化。当它超出范围时(或者在程序结束时,如果它在命名空间范围内),它将自动解除分配。你应该更喜欢这个new
,除非你确实需要一个动态的生命周期。
在任何情况下都不会使用赋值运算符。初始化不是赋值,即使它确实使用了=
令牌。
答案 1 :(得分:1)
new
运算符将调用复制构造函数。
指针的赋值不会调用赋值运算符。
因此,在此示例中,第一个单行创建一个新对象作为第一个的副本。第二个单行(假设primary
在这里是另一种类型 - 指针而不是对象,否则代码将无法编译或者您需要定义更多赋值运算符)创建另一个指向同一对象的指针。