这两个例子有什么不同
What is the difference between these two instances?
我有这个构造函数:
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
在这里是另一种类型——指针而不是对象,否则代码将无法编译,或者您需要定义更多的赋值运算符)创建指向同一对象的另一个指针。
相关文章:
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 比较两个节点坐标的最佳方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- C++ 参考:这两个语句有什么区别?
- 这两个C++语句连接字符串有什么区别?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 比较两个不同的字符串时,C++比较什么?
- 以下两个代码段有什么区别?
- 两个代码段之间有什么区别?
- 如果将两个相同的指针作为输入传递,memcmp 会做什么?
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 在 c++ 中抽象两个略有不同的函数的最佳方法是什么?
- 对两个案例标签使用相同的值与对单个案例使用多个案例标签有什么区别?
- 这两个类语句之间有什么区别?
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?