复制控制疑问

ProgrammingRing 2012-11-16 10:45:59


#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Bulk_item;
class Item_base
{
public:
Item_base(const string &book = "",
double sales_price = 0.0) : isbn(book), price(sales_price)
{
cout << "Item_base构造函数Item_base(const string &, double)" << endl;
}
string book() const { return isbn; }
virtual double net_price(size_t n) const { return n * price; }
Item_base(const Item_base &ib) : isbn(ib.isbn), price(ib.price)
{
cout << "Item_base复制构造函数Item_base(const Item_base &)" << endl;
}
Item_base& operator=(const Item_base &rhs)
{
isbn = rhs.isbn;
price = rhs.price;
cout << "Item_base赋值操作符Item_base::operator=" << endl;

return *this;
}
virtual ~Item_base() { cout << "Item_base析构函数~Item_base()" << endl; }
//////////////////////////////////////////////////////////////////////////

protected:
double price;

private:
string isbn;
};
class Bulk_item : public Item_base
{
public:
Bulk_item(const string &book = "",
double sales_price = 0.0, size_t qty = 0,
double disc_rate = 0.0) : Item_base(book, sales_price),
min_qty(qty), discount(disc_rate)
{ cout << "Bulk_item构造函数Bulk_item(const string &, double, size_t, double)" << endl; }
double net_price(size_t cnt) const
{
if (cnt > min_qty)
return cnt * (1 - discount) * price;
else
return cnt * price;
}
Bulk_item(const Bulk_item &ib) : Item_base(ib), min_qty(ib.min_qty), discount(ib.discount)
{
cout << "Bulk_item复制构造函数Bulk_item(const Bulk_item &)" << endl;
}
Bulk_item& operator=(const Bulk_item &rhs)
{
if (this != &rhs)
Item_base::operator=(rhs);
min_qty = rhs.min_qty;
discount = rhs.discount;
cout << "Bulk_item赋值操作符Bulk_item::operator=()" << endl;

return *this;
}
virtual ~Bulk_item() { cout << "Bulk_item析构函数~Bulk_item()" << endl; }
//////////////////////////////////////////////////////////////////////////

private:
size_t min_qty;
double discount;
};

int main()
{
vector<Item_base> ivec;
string book;
size_t n;
double dis, price;

while (cin >> book >> price >> n >> dis)
{
Bulk_item temp(book, price, n, dis);
ivec.push_back(temp);
}
double sum = 0.0;
for (vector<Item_base>::iterator it = ivec.begin(); it != ivec.end(); ++it)
sum += it->net_price(100);
cout << sum << endl;

return 0;
}

用上面代码输入后输出情况片段如下:
book 10 2 0.5
Item_base构造函数Item_base(const string &, double) // 这两个构造函数用于构造一个临时对象
Bulk_item构造函数Bulk_item(const string &, double, size_t, double)
Item_base复制构造函数Item_base(const Item_base &) // 复制给push_back
Bulk_item析构函数~Bulk_item() // 释放临时对象
Item_base析构函数~Item_base()
book 5 3 0.1
Item_base构造函数Item_base(const string &, double)
Bulk_item构造函数Bulk_item(const string &, double, size_t, double)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base析构函数~Item_base()
Bulk_item析构函数~Bulk_item()
Item_base析构函数~Item_base()
book 2 3 0.2
Item_base构造函数Item_base(const string &, double)
Bulk_item构造函数Bulk_item(const string &, double, size_t, double)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base析构函数~Item_base()
Item_base析构函数~Item_base()
Bulk_item析构函数~Bulk_item()
Item_base析构函数~Item_base()
book 3 2 0.3
Item_base构造函数Item_base(const string &, double)
Bulk_item构造函数Bulk_item(const string &, double, size_t, double)
Item_base复制构造函数Item_base(const Item_base &)
Bulk_item析构函数~Bulk_item()
Item_base析构函数~Item_base()
book 10.2 2 0.5
Item_base构造函数Item_base(const string &, double)
Bulk_item构造函数Bulk_item(const string &, double, size_t, double)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base复制构造函数Item_base(const Item_base &)
Item_base析构函数~Item_base()
Item_base析构函数~Item_base()
Item_base析构函数~Item_base()
Item_base析构函数~Item_base()
Bulk_item析构函数~Bulk_item()
Item_base析构函数~Item_base()
book 10.3 3 0.8
Item_base构造函数Item_base(const string &, double)
Bulk_item构造函数Bulk_item(const string &, double, size_t, double)
Item_base复制构造函数Item_base(const Item_base &)
Bulk_item析构函数~Bulk_item()
Item_base析构函数~Item_base()
上面这些输出看的我很晕,第一次的输出我可以理解,我觉得每次都是那个过程吧?创建临时对象--复制给函数--释放临时对象,可是为什么之后的输出几乎很乱啊?多了好多的复制构造函数和析构函数,请问这些都是应用于哪里的?
...全文
151 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrammingRing 2012-11-25
  • 打赏
  • 举报
回复
问题出在vector每次预分配的内存不够时重新分配然后复制和销毁原对象
benbendeda 2012-11-17
  • 打赏
  • 举报
回复
引用 5 楼 ProgrammingRing 的回复:
引用 4 楼 benbendeda 的回复:c++,类继承,书里面的知识 是啊,可是我认为执行流应该就是下面这样: Item_base构造函数Item_base(const string &, double) // 这两个构造函数用于构造一个临时对象 Bulk_item构造函数Bulk_item(const string &, doubl……
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Bulk_item;
class Item_base
{
public:
	Item_base(const string &book = "", 
		double sales_price = 0.0) : isbn(book), price(sales_price) 
	{
		cout << "Item_base构造函数Item_base(const string &, double)" << endl;
	}
	string book() const { return isbn; }
	virtual double net_price(size_t n) const { return n * price; }
	Item_base(const Item_base &ib) : isbn(ib.isbn), price(ib.price)
	{ 
		cout << "Item_base复制构造函数Item_base(const Item_base &)" << endl; 
	}
	Item_base& operator=(const Item_base &rhs)
	{
		isbn = rhs.isbn;
		price = rhs.price;
		cout << "Item_base赋值操作符Item_base::operator=" << endl;

		return *this;
	}
	virtual ~Item_base() { cout << "Item_base析构函数~Item_base()" << endl; }
	//////////////////////////////////////////////////////////////////////////

protected:
	double price;

private:
	string isbn;
};
class Bulk_item : public Item_base
{
public:
	Bulk_item(const string &book = "",
		double sales_price = 0.0, size_t qty = 0,
		double disc_rate = 0.0) : Item_base(book, sales_price),
		min_qty(qty), discount(disc_rate) 
	{ cout << "Bulk_item构造函数Bulk_item(const string &, double, size_t, double)" << endl; }
	double net_price(size_t cnt) const 
	{
		if (cnt > min_qty)
			return cnt * (1 - discount) * price;
		else
			return cnt * price;
	}
	Bulk_item(const Bulk_item &ib) : Item_base(ib), min_qty(ib.min_qty), discount(ib.discount)
	{
		cout << "Bulk_item复制构造函数Bulk_item(const Bulk_item &)" << endl;
	}
	Bulk_item& operator=(const Bulk_item &rhs)
	{
		if (this != &rhs)
			Item_base::operator=(rhs);
		min_qty = rhs.min_qty;
		discount = rhs.discount;
		cout << "Bulk_item赋值操作符Bulk_item::operator=()" << endl;

		return *this;
	}
	virtual ~Bulk_item() { cout << "Bulk_item析构函数~Bulk_item()" << endl; }
	//////////////////////////////////////////////////////////////////////////

private:
	size_t min_qty;
	double discount;
};

int main()
{
	vector<Item_base> ivec;
	string book;
	size_t n;
	double dis, price;

	while (cin >> book >> price >> n >> dis)
	{

		
		 Bulk_item temp(book, price, n, dis);
		//ivec.push_back(temp);            //问题在这,你去看看有关将一个对象压入vevtor的内容吧
	}
	double sum = 0.0;
	for (vector<Item_base>::iterator it = ivec.begin(); it != ivec.end(); ++it)
		sum += it->net_price(100);
	cout << sum << endl;


	system("pause");
	return 0;
}
ProgrammingRing 2012-11-17
  • 打赏
  • 举报
回复
确实是vector那里的问题,看来要清楚,得研究vector了,还有1楼,我刚试了下,重载的赋值操作符并不调用析构函数啊!?
ProgrammingRing 2012-11-16
  • 打赏
  • 举报
回复
引用 4 楼 benbendeda 的回复:
c++,类继承,书里面的知识
是啊,可是我认为执行流应该就是下面这样: Item_base构造函数Item_base(const string &, double) // 这两个构造函数用于构造一个临时对象 Bulk_item构造函数Bulk_item(const string &, double, size_t, double) Item_base复制构造函数Item_base(const Item_base &) // 复制给push_back Bulk_item析构函数~Bulk_item() // 释放临时对象 Item_base析构函数~Item_base() 这是每次输入基本都不一样,那些多出来的复制、析构函数我实在是不知道在哪里引发的
benbendeda 2012-11-16
  • 打赏
  • 举报
回复
c++,类继承,书里面的知识
ProgrammingRing 2012-11-16
  • 打赏
  • 举报
回复
引用 1 楼 anhuizhuanjiao 的回复:
引用 楼主 ProgrammingRing 的回复:C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798……
那每次的输出应该是相同的吧?为什么会很乱?
慧钦 2012-11-16
  • 打赏
  • 举报
回复
觉得太多了看不过来,先把primer上面那个类似的例子先弄清楚吧
转角天边 2012-11-16
  • 打赏
  • 举报
回复
引用 楼主 ProgrammingRing 的回复:
C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495<span st……
你Item_base类重载了操作符,每次调用重载的操作符时也会调用Item_base类的析构函数

64,686

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧