Bootstrap

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

#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)
的方式对一个对象进行初始化的。



;