#include "iostream"
#include "string.h"
using namespace std;
class Person
{
public:
Person(const char *name,int age);
~Person();
void setName(const char *name);
void setAge(int age);
char* getName();
int getAge();
void display();
Person(const Person &a); //拷贝构造函数
private:
char *m_name;
int m_age;
};
Person::Person(const char *name,int age)//构造函数 注:这里加const是因为参数是字符串是常量,不可修改的。不然会有警告
{
m_name = new char;
if(m_name != NULL)
{
strcpy(m_name,name);
m_age = age;
}
}
Person::~Person() //析构函数
{
delete m_name;
}
void Person::setName(const char *name) //设置名字 注:这里加const是因为参数是字符串是常量,不可修改的。不然会有警告
{
strcpy(m_name,name);
}
void Person::setAge(int age) //设置年龄
{
m_age = age;
}
int Person::getAge() //返回年龄
{
return m_age;
}
char* Person::getName() //返回名字 注:这里返回char *类型的指针,返回的m_name是名字字符串的第一个地
{ 但是可能是因为Cout就将整个字符串直到遇到'\0'打印出来了 ,类似于C语言中printf中 的%s %c的区别
return this->m_name;
}
Person::Person(const Person &a) //拷贝构造函数
{
m_name = new char; //注:虽然是拷贝,但是这里是深拷贝,所以要再new一个新的对象名字空间
strcpy(m_name,a.m_name);
m_age = a.m_age;
}
void Person::display() //打印函数
{
cout<<m_name<<' '<<m_age<<endl;
}
//主函数
int main()
{
Person p1("zhaoyu",20);
p1.display();
Person p2(p1);
p2.setName("liwei");
p2.display();
p1.display();
}
注:浅拷贝是用缺省拷贝构造函数实现的:
可以看出上面浅拷贝的时候他们的资源(私有成员)是共用的;
深拷贝与浅拷贝 **什么是深拷贝?什么是浅拷贝? **答:深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会 在新对象中创建一个新的和原始对象中对应字段相同(内容 相同)的字段,也就是说这个引用和原始对象的引用是不同 的,我们改变新对象中的这个字段的时候是不会影响到原始 对象中对应字段的内容。 ** 缺省拷贝构造函数是采用浅拷贝即位拷贝(bitwise copy) 的方式对一个对象进行初始化的。 |