这两条线有什么不同吗
Are there any differences between these two lines?
我们可以通过两种方式创建对象:
myClass myObject = myClass(123);
//or
myClass myObject(123);
这两个人的背景有什么不同吗?我想使用第一条,但它似乎结合了这两条线:
myClass myObject;
myObject= myClass(123);
第二个也做同样的事情吗?
myClass myVariable = myClass(123);
是复制初始化。
myClass myVariable(123);
是直接初始化。
myClass myVariable;
myVariable = myClass(123);
是默认初始化,然后是复制(或移动)分配。
通常,前两个是相同的,因为复制省略。相关规则可在[class.copy]/31(N4140,C++14标准草案)中找到:
当满足某些标准时,允许省略实现类对象的复制/移动构造[…]:
--当尚未绑定到引用的临时类对象(12.2)将被复制/移动到具有相同cv不合格类型,复制/移动操作可以通过将临时对象直接构建到省略复制/移动
最终我不知道。您已经描述了定义对象的三种方法,这三种方法都将对象放在堆栈的顶部,调用相同的构造函数。如果使用new
运算符,则功能会有所不同。
这一行不使用赋值运算符(据我所知,这两行是等价的)。语法中使用了=
,但实际上没有使用operator=
:
myClass myVariable = myClass(123);
//or
myClass myVariable(123);
这个使用赋值运算符:
myClass myVariable;
myVariable = myClass(123);
若赋值运算符执行得不好或并没有实现,第一个语句就可以工作,第二个语句可能(而且很可能)崩溃。
#include <iostream>
#include <string.h>
using namespace std;
class Dvector
{
public:
Dvector( int thesize = 0 )
{
std::cout << "Constructing object of size " << thesize << std::endl;
size = thesize;
data = new double[size];
}
Dvector( const Dvector& v )
{
std::cout << "Constructing object of size " << v.size << " by copy" << std::endl;
size = v.size;
data = new double[size];
memcpy( data, v.data, sizeof(double)*size );
}
Dvector& operator=( const Dvector& v )
{
std::cout << "Assigning object of size " << v.size << std::endl;
if ( &v != this )
{
size = v.size;
data = new double[size];
memcpy( data, v.data, sizeof(double)*size );
}
return *this;
}
~Dvector()
{
std::cout << "Destroying object" << std::endl;
delete [] data;
}
private:
double* data;
int size;
};
int main() {
Dvector v = Dvector(3);
return 0;
}
显示器:
Constructing object of size 3
Destroying object
何时:
int main() {
Dvector v;
v = Dvector(3);
return 0;
}
显示器:
Constructing object of size 0
Constructing object of size 3
Assigning object of size 3
Destroying object
Destroying object
如果没有定义复制构造函数,就会崩溃。。。因为CCD_ 4最终指向由临时变量(Dvector(3)
)分配的CCD_。尝试访问v.data
或v
销毁(删除已释放的内存)时可能发生崩溃。
相关文章:
- 我不知道这条线是做什么的
- 向量:两条线,需要解释
- 当两个线程同时尝试在同一静音上尝试try_lock()时会发生什么
- 一条线和两行声明之间的差异
- C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
- 如果用像素来给出两条线(外部和内部)之间的边缘(外部和内部)之间的边缘,则如何计算(x,y)坐标
- CSV文件中的两条线的交点的计算返回-1.#IND
- 仅使用整数计算两条线的交点
- 这条线想做什么
- 两条线之间的Arduino距离
- 这两条线有什么不同吗
- OpenGL:在两个元素之间画一条线
- 使用增强几何体检查两条线是否有交点
- 查找表示 GPS 路线的两条线(MATLAB、Java、C++ 或 Python)之间的距离
- 只是想知道这条线对计算机的作用/意味着什么
- 为什么这两条线会产生不同的溢出行为
- 这两种线程方法之间有什么区别
- 这是检验两条线是否共线的正确方法吗?
- 计算分隔两条线的最小平移量
- 找出两条线是否相交