析构函数和拷贝构造函数训练

参考自《Visual C++ 2013 入门经典》P287

// xigouhanshu.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
#include <string>
using namespace std;


using namespace std;
class Cbox
{
protected:
	double m_height;
	double m_width;
	double m_length;
	char* m_pMsg;
public:
	//关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。
	//声明为explicit的构造函数不能在隐式转换中使用。
	explicit Cbox(double lv, double wv, double hv, char* text = "Default Value") :m_height(hv), m_width(wv), m_length(lv)
	{
		cout << "Constructor called" << endl;
		size_t len = strlen(text) + 1;
		m_pMsg = new char[len + 1]; //指针,还没分配空间
		strcpy_s(m_pMsg, len + 1, text); //#include <cstring>
	}


	Cbox()
	{
		cout << "Construtor called~~~~ " << endl;
	}
	//默认?再定义i拷贝构造
	//私有成员包含了一个指针,如果不定义拷贝函数,两个对象中指针成员会指向同一个对象(字符串),一改皆改
	//定义拷贝构造重要性,类定义外的函数,如果参数是该类,而不是引用类型,采用值传递的方式,就会出错
	Cbox(const Cbox& copy)
	{
		size_t len = strlen(copy.m_pMsg) + 1;
		m_pMsg = new char[len + 1]; //这里 如果写成new char(len+1)析构会有异常出现
		strcpy_s(m_pMsg, len, copy.m_pMsg);
		cout << "copy constructor " << endl;
	}
	~Cbox()
	{
		cout << "Destructor called" << endl;
		delete[] m_pMsg; //不释放内存,也可以正常结束;但在大型程序中,太多的动态分配对象会耗尽内存
	}
	//在函数中动态创建对象,函数返回时会自动销毁该对象


	void showIt()const
	{
		cout << m_pMsg << endl;
	}
	double getVoume()const
	{
		return m_height*m_width*m_length;
	}






};
bool compare(const Cbox* p)
{
	if (!p)
		return false;
	Cbox a(10, 10, 10, "anyway");
	return a.getVoume() > p->getVoume();
}




int main()
{
	//如果不定义析构函数,会有默认析构
	//自动生成的变量(非new生成的)在程序结束时调用
	Cbox a(12, 12, 12);
	Cbox b(10, 10, 10, "QQQ");
	char* c = "LLL";
	Cbox d(10, 10, 10, c);
	Cbox e(d); //拷贝构造
			   //Cbox b[5];
	Cbox* p = nullptr; //不会构造
	p = &a;
	//空闲寄存器中生成的变量,需要在类的析构函数中显式定义
	compare(&a);
	Cbox* q = new Cbox{ 5,5,5 };
	delete q;
	system("pause");
	return 0;
}


结果为:

Constructor called
Constructor called
Constructor called
Constructor called
Destructor called

请按任意键继续. . .
Destructor called
Destructor called
Destructor called




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值