//这里为什么定义个display()全局函数,作为舞台,让对象唱戏,不能直接把他们放在主函数里面吗,这样写好处在哪,两者区别在哪?????

#include <iostream>
using namespace std;
class Name
{
public:
Name(char *myn)//初始化构造函数
{
size = strlen(myn);
pName=(char *)malloc(size + 1);
strcpy(pName,myn);
}
//拷贝构造函数
Name(Name &obj)
{
size = obj.size;
pName = (char *)malloc(size+1);
strcpy(pName,obj.pName);
}
//析构函数
~Name()
{
if (pName!=NULL)
{
free(pName);
pName = NULL;
size = 0;
}
}


Name& operator=(Name &obj1)
{
//重载等号运算符:
//1先释放旧的内存  释放的是obj3的内存
if (this->pName!=NULL)
{
delete[] pName;
size = 0;
}
//2 根据obj1 分配内存大小
this->size = obj1.size;
this->pName = new char[size + 1];
//3 把obj1复制给obj3
strcpy(this->pName,obj1.pName);


return *this;
}


void print()
{
cout << "pName:" << pName << endl;
}
private:
int size;
char *pName;
};
//这里为什么定义个display()全局函数,作为舞台,让对象唱戏,不能直接把他们放在主函数里面吗,这样写好处在哪,两者区别在哪?????
void display()
{
Name obj1("liukan");
//对象析构第二次发生 coredump   发生浅拷贝  因为没有默认拷贝函数,c++编译器会自动调用默认的
//原因:只把obj1的值给赋值到obj2,但是没有连带obj1值以及指向的堆空间,导致复制过来的,依然指向obj1的内存空间,
//两个指向同一个地址空间,析构的时候自然在第一次成功,第二次何来析构
Name obj2 = obj1;
obj2.print();


//这里就无法采用自己编写拷贝构造函数解决浅拷贝问题
Name obj3("NoName");
obj3 = obj1;//=运算符 也是属于浅拷贝 原因同上
obj3.print();

//我们采用重载等号运算符
//obj3 = obj1
//obj3.operator=(obj1);
//Name& operator=(Name &obj1);


//ObjectL op objectR
//重载为成员函数,解释为:
//ObjectL.operator op (ObjectR)
//左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递
}
int main()
{
display();


cout << "hell0..." << endl;
system("pause");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值