构造函数、析构函数、拷贝构造函数、赋值运算

//PotionName.cpp
#include <iostream>
#include <string.h>
using namespace std;

class PointName
{
public:  //任何类至少有两个构造函数——(构造&拷贝构造)
	PointName(const char *pName="NoName")  //构造函数:用来初始化,函数名必须与类名一致:eg. 类名(零个、一个、多个 )
	{
		name =  new char[strlen(pName)+1];  //申请空间  //???????为什么要加1
		strcpy(name,pName);//pName赋值给name 
		cout << "Constructing an object of PonitName \""
		     << name << "\"." << endl;
	}
	//默认构造函数:若未定义构造函数,系统默认不初始化
		//不需要实参的构造函数
		//静态全局对象、静态局部对象、全局对象 默认初始化为0  //?????位于的内存区域:stack????
		//局部自动对象、动态对象  不可预知   //??????位于heap????????
	
	
	PointName(const PointName &pn)   //深拷贝构造函数(复制构造函数):eg.类名(const 类名 & 形参)
	{
		name = new char[strlen(pn.name)+1];
		strcpy(name,pn.name);
		cout << "COPY construction an object of PointName \""
			 << name << "\"." << endl;
	}
	//与构造函数使用场合不同,使用场合:
		//1.创建新对象时,用已存在的对象为初始化值
		//2.调用函数时,用实参(已经存在的对象)初始化 值传递 创建的形参
		//3.函数类 类型对象 值返回 时,用函数所返回的表达式 初始化 值返回时 创建的临时对象
		//2.3.称创建了对象的副本
	
	//突破字符串最大长度限制的方法:创建对象时 由构造函数 为对象 申请堆空间 new
	//对象空间 = 对象基本空间 + 对象资源空间
		//eg.本函数中,对象基本空间为 sizeof(char *)   对象资源空间为 sizeof(char[strlen(pName)+1])
	
	//浅拷贝:仅拷贝对象基本空间的数据成员  //(默认 拷贝构造函数 是浅拷贝)
	//深拷贝:构造属于自己的资源空间 要申请自己的资源空间 new 
	
	~PointName()   //析构函数(逆构造函数)
	{
		cout << "Desrtucting an object of PointName \""
			 << name << "\"." << endl;
	}
	//默认析构函数:清理 对象基本空间
	//定义析构函数:清理 对象资源空间
	
	//delete 自动调用析构函数
	
	PointName & operator=(const PointName &pn)  //深赋值运算符函数 : 对象名 & operator=(const 类名 & 形参)
	{                                                              // {   ……  return *this;}
		cout << "ASSIGN an object of PointName \""
			 << pn.name << "\"." << endl;
			 if(&pn != this)
			 {
				 if(name)delete [] name;  //  1.
				 name = new char[strlen(pn.name)+1];  //  2.
				 strcpy(name,pn.name);  //  3.
			 }
			 return *this;  //  4.
	}
	//浅赋值(默认):对对象的数据成员 依此赋值
	//深赋值:  // 1.主动释放对象原有资源
				// 2.重构对象新资源空间
				// 3.复制右值填充新资源
				// 4.引用返回本对象(*this)
	
	//运算符函数://之前记过笔记     //?????????非静态成员函数?????
		//调用:对象名.opterator=(右值) ||  对象名 = 右值
	
	void UpperName()  //大写
	{
		cout << "Upper \"" << name << "->\"";
		strupr(name);
		cout << name << "\"." << endl;
	}
	
	void Show() const
	{
		cout << "\"" << name << "\"" << endl;
	}
private:
	char *name;   //字符串指针
};
//若类的对象可能带有资源,则应该:
	//1.定义深拷贝函数
	//2.重载赋值运算符实现深赋值
	//3.定义析构函数释放资源

int main()
{
	char str[10] = "Tom",*ptr = new char[10];
	strcpy(ptr,"Jerry");
	
	PointName pn1(str),pn2(ptr),pn3("Snoopy");
	pn1.Show();
	pn2.Show();
	pn3.Show();
	
	cout << "Do something..." << endl;
	strcpy(str,"Winnie");  //给str赋值,不影响pn1
	pn1.Show();
	
	delete [] ptr;  //释放ptr,不影响pn2
	pn2.Show();
	
	pn3.UpperName();
	pn3.Show();
	
	PointName pn4 = pn1;
	pn4.Show();
	
	pn2 = pn1;
	pn2.Show();
	
	cout << "Return to Operating System." << endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值