码迷,mamicode.com
首页 > 其他好文 > 详细

第十一周 【项目2 - 职员有薪水了】深复制

时间:2015-05-31 18:34:22      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:string   指针   c++   iostream   

(2)字符串除了用C++扩充的string类型外,按C语言的传统,还可以用char *表示。请将类声明中的string全部改为char *后,重新写一遍程序(此时的区别是,类中有指针成员,构造和析构函数需要考虑深复制的问题了。)

  1. class CPerson  
  2. {  
  3. protected:  
  4.     char *m_szName;  
  5.     char *m_szId;  
  6.     int m_nSex;//0:women,1:man  
  7.     int m_nAge;  
  8. public:  
  9.     CPerson(char *name,char *id,int sex,int age);  
  10.     void Show1();  
  11.     ~CPerson();  
  12. };  
  13. class CEmployee:public CPerson  
  14. {  
  15. private:  
  16.     char *m_szDepartment;  
  17.     float m_Salary;  
  18. public:  
  19.     CEmployee(char *name,char *id,int sex,int age,char *department,float salary);  
  20.     void Show2();  
  21.     ~CEmployee();  
  22. };  
  23. int main()  
  24. {  
  25.     char name[10],id[19],department[10];  
  26.     int sex,age;  
  27.     float salary;  
  28.     cout<<"input employee‘s name,id,sex(0:women,1:man),age,department,salary:\n";  
  29.     cin>>name>>id>>sex>>age>>department>>salary;  
  30.     CEmployee employee1(name,id,sex,age,department,salary);  
  31.     employee1.Show2();  
  32.     return 0;  
  33. }  
[参考解答]
/*
*Copyright (c)2014,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:d.cpp
*作    者:张旺华
*完成日期:2015年5月31日
*版 本 号:v1.0
*/

#include <iostream>
#include<iomanip>
#include<cstring>
using namespace std;

class CPerson
{
protected:
    char *m_szName;
    char *m_szId;
    int m_nSex;//0:women,1:man
    int m_nAge;
public:
    CPerson(char *name,char *id,int sex,int age);
    void Show1();
    ~CPerson();
};
CPerson::CPerson(char *name,char *id,int sex,int age)
{
    m_szName=new char[strlen(name)+1];    //这里我们要考虑\0的存在
    strcpy(m_szName,name);     //进行复制操作,strcpy是函数自带的用于的字符串之间赋值操作。
    m_szId=new char[strlen(id)+1];
    strcpy(m_szId,id);
    m_nSex=sex;
    m_nAge=age;
}
class CEmployee:public CPerson
{
private:
    char *m_szDepartment;
    float m_Salary;
public:
    CEmployee(char *name,char *id,int sex,int age,char *department,float salary);
    void Show2();
    ~CEmployee();
};
CEmployee::CEmployee(char *name,char *id,int sex,int age,char *department,float salary)
    :CPerson(name,id,sex,age)  //这里直接调用基类函数的构造函数就可以了
{
    m_szDepartment=new char[strlen(department)+1];
    strcpy(m_szDepartment,department);
    m_Salary=salary;
}
CPerson::~CPerson() {}
void CPerson::Show1()
{
    cout<<setw(10)<<m_szName<<setw(25)<<m_szId;
    if(m_nSex==0)
        cout<<setw(7)<<"women";
    else
        cout<<setw(7)<<"man";
    cout<<setw(5)<<m_nAge<<endl;
}
CEmployee::~CEmployee() {}
void CEmployee::Show2()
{
    cout<<setw(10)<<"name"<<setw(25)<<"id"<<setw(7)<<"sex"<<setw(5)<<"age"<<setw(12)<<"department"<<setw(10)<<"salary"<<endl;
    cout<<setw(10)<<m_szName<<setw(25)<<m_szId;
    if(m_nSex==0)
        cout<<setw(7)<<"women";
    else
        cout<<setw(7)<<"man";
    cout<<setw(5)<<m_nAge;
    //由于基类CPerson的成员变量采用了protected属性,因此可采用上述述代码实现,否则若
    //基类CPerson的成员变量采用了privated属性,则只能使用CPerson::Show();实现
    cout<<setw(12)<<m_szDepartment<<setw(10)<<m_Salary<<endl;
}
int main()
{
    char name[10],id[19],department[10];
    int sex,age;
    float salary;
    cout<<"input employee's name,id,sex(0:women,1:man),age,department,salary:\n";
    cin>>name>>id>>sex>>age>>department>>salary;
    CEmployee employee1(name,id,sex,age,department,salary);
    employee1.Show2();
    return 0;
}

运行结果:
技术分享
知识点运用及学习心得:
在这里主要讲了是类中的深复制,我们在这里的深复制是对字符串进行的。
在百科里面是:是对对象事例中字段引用的对象也进行复制的一种方式.所以,如果一个对象有一个指向字符串的字段,并且对该对象做了一个深复制的话.我们将创建一个新的对象和一个新的字符串.-新对象将指向新字符串.

第十一周 【项目2 - 职员有薪水了】深复制

标签:string   指针   c++   iostream   

原文地址:http://blog.csdn.net/wh201458501106/article/details/46289561

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!