//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;
}
构造函数、析构函数、拷贝构造函数、赋值运算
于 2023-09-18 11:53:45 首次发布