c++primer ch13学习小记

练习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()

这样的结果就验证了我们的观点。

对于调用的析构函数来说,以上提到的初始化过的都会调用析构函数。

 

本人水平有限,如有问题请纠正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值