练习13.13 首先贴出代码
struct X {
X() { cout << "X()" << endl; }
X(const X&) { cout << "X(const X&)" << endl; }
X& X::operator=(const X &h) {
std::cout << "X& operator=(const X&)" << std::endl; return *this;
}
~X() { cout << "~X()" << std::endl; }
};
void f(const X &rx, X x)
{
std::vector<X> vec;
vec.reserve(2);
vec.push_back(rx);
vec.push_back(x);
}
int main()
{
X *px = new X;
f(*px, *px);
delete px;
system("pause");
return 0;
}
该程序会输出
X()
X(const X&)
X(const X&)
X(const X&)
~X()
~X()
~X()
~X()
首先第一个 直接构造 是在 X *px = new X; 时 创建了一个X类的变量,第二三四行的const X&出现是因为三次调用了拷贝初始化,出现在f函数里面对于传入实参进行形参x的拷贝,以及vector中两个对象对于rx,x的拷贝。
接下来验证下此观点,我们将vec.push_back(x); 这一行注释掉,并且将函数需要的第二个形参变量删除,可以看见结果变化为
X()
X(const X&)
~X()
~X()
这样的结果就验证了我们的观点。
对于调用的析构函数来说,以上提到的初始化过的都会调用析构函数。
本人水平有限,如有问题请纠正。