#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;
}
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;
}