我有以下一段代码,我有一个问题。
V v(10,0);//first argument is size and the second is init val for each element
...
v = V(5,0);
当我调用V(5,0)并将其分配给第二行中的v时,先前分配的v是否会自动销毁?是否创建了V类型的新对象并将其分配给v?我不完全了解幕后发生的事情。
答案 0 :(得分:3)
V v(10,0);
编译器将在callstack(而不是堆)上分配一些空间,然后调用内存中该位置的V(int,int)
构造函数来构造对象。
v = V(5,0);
这实际上是几个部分,我将分开:
....V(5,0).
再次:编译器将在callstack(而不是堆)上分配一些空间,然后调用内存中该位置的V(int,int)
构造函数来构造临时的未命名对象。
v = .......
编译器调用v.operator=(const V&)
成员,该成员可能会将参数(未命名的V
临时)中的内容复制到指定的v
对象。
..........;
表达式已结束,因此编译器调用~V
析构函数来销毁临时对象,然后(可能)释放callstack上的空间以便以后重用。
当作用域结束时(通常:当函数结束时),编译器将自动调用~V
析构函数来销毁命名的v
对象,然后释放callstack上的空间。