您的位置:首页 > 编程语言 > C语言/C++

C++ Person类示例程序以及深拷贝和浅拷贝

2017-03-06 18:19 260 查看
#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)
的方式对一个对象进行初始化的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: