| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1610 人关注过本帖
标题:类的深复制构造函数/没有错误,运行不出结果
只看楼主 加入收藏
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:2 
类的深复制构造函数/没有错误,运行不出结果
ex.h
程序代码:
#ifndef EX2_H_INCLUDED
#define EX2_H_INCLUDED

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

class Person
{
protected:
    char Id[19]; //身份证号
    char Name[12]; //姓名
    bool Gender; //性别
    char *pHa; //家庭住址
    static int num; // Person对象个数
public:
    Person(char id[]="No Id",char na[]="No name",bool gen=false,char *pha=NULL);//默认构造
    Person(Person& rp);//复制构造函数
    ~Person();//析构函数
    Person& assign(Person& rp);//对象赋值
    void change(char *pha);//用形参改变现有住址
    void showpara();//显示类的所有数据成员
    static void shownum();//显示对象个数

};

#endif // EX2_H_INCLUDED


ex.cpp
程序代码:
#include "ex2.h"

//Person类实现
Person::Person(char id[],char na[],bool gen,char *pha)//默认构造
{
    strcpy(Id,id);
    strcpy(Name,na);
    Gender=gen;
    if(pha!=NULL)
    {
        pHa=new char[strlen(pHa)+1];
        strcpy(pHa,pha);
    }
    else pHa=NULL;


    num++;
}

Person::Person(Person& rp)//复制构造函数
{
    strcpy(Id,rp.Id);
    strcpy(Name,rp.Name);
    Gender=rp.Gender;
    if(pHa!=NULL)
    {
        pHa=new char[strlen(pHa)+1];
        strcpy(pHa,rp.pHa);
    }
    else pHa=NULL;


    num++;
}

Person::~Person()//析构函数
{
    if(pHa!=NULL)
        delete []pHa;
    num--;
}

Person& Person::assign(Person& rp)//对象赋值
{
    strcpy(Id,rp.Id);
    strcpy(Name,rp.Name);
    Gender=rp.Gender;
    if(pHa!=NULL)
        delete []pHa;
    if(rp.pHa!=NULL)
    {
        pHa=new char[strlen(rp.pHa)+1];
        strcpy(pHa,rp.pHa);
    }
    else
        pHa=NULL;
}

void Person::change(char *pha) //用形参改变现有住址
{
    if(pha!=NULL)
    {
        pHa=new char[strlen(pha)+1];
        strcpy(pHa,pha);
    }
    else
        pHa=NULL;
}



void Person::showpara() //显示类的所有数据成员
{
    cout<<"身份证号:"<<Id;
    cout<<"姓名:"<<Name;
    cout<<"性别:"<<(Gender==true?"man":"women");
    cout<<"家庭住址:"<<pHa;
}

void Person::shownum() //显示对象个数
{
    cout<<"对象个数"<<num;
}


main.cpp
程序代码:
#include "ex2.h"
int Person::num=0;
int main()
{
    Person per1("320505","张三",false,"江苏省南京市鼓楼区鼓楼大街3号");
    Person per2("321102","李四",true,"江苏省无锡市");
    Person per4(per2),per3;
    Person *pp=new Person("420686","王五",true);
    per1.showpara();
    per2.showpara();
    per3.showpara();
    per4.showpara();
    pp->showpara();
    per4.assign(per3.assign(per1));
    per3.showpara();
    per4.showpara();
    per4.change("江苏省常州市钟楼区中吴大道1801号江苏理工学院");
    per4.showpara();
    pp->change("新疆乌鲁木齐市和平大街15号");
    pp->showpara();
    Person::shownum();
    delete pp;
    //per4.shownum();
    //per3=per1; 该语句运行后产生什么现象,试解释
    return 0;
}


ex2.zip (405.94 KB)
搜索更多相关主题的帖子: Person strcpy Name char NULL 
2020-11-08 20:21
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
收藏
得分:0 
定义人员类Person,有保护型数据成员:char Id[19](身份证号)、char Name[12](姓名)、bool Gender(性别)、char *pHa(家庭住址),静态数据成员int num(Person类对象总数)。考虑到每个人员家庭住址的字符长度不一,所以pHa为指向人员住址的字符型指针,家庭住址占用的内存在构造和复制构造函数中动态申请。定义如下成员函数:
构造函数、深复制构造函数、析构函数。
Person& assign(Person& rp)函数,完成人员对象赋值。
    void change(char *pha) 函数,用形参改变现有住址。
void showpara()函数,显示Person类对象数据。
static void shownum()函数,显示Person类对象总数。
在主函数中建立Person类对象,其中至少用new运算建立一个对象,调用成员函数。观察、解释运行结果。   
注释掉复制构造函数,观察、解释运行结果。
注释掉析构函数,观察、解释运行结果。

长风吹过
2020-11-08 20:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:50 
你的问题是什么?

首先,出题者的水平……,基本上算是不会C++。
起码连 const 都不知道要加。

Person::Person(char id[],char na[],bool gen,char *pha)
中 pHa=new char[strlen(pHa)+1]; 我猜你想写的是 strlen(pha) 吧

Person::Person(Person& rp)
中 pHa=new char[strlen(pHa)+1]; 我猜你想写的是 strlen(rp.pHa) 吧

Person& Person::assign(Person& rp)
中缺 return 语言;
更严重的是没有判断 this == &rp。

void Person::change(char *pha)
中需要先释放 pHa。

void Person::showpara()
中 cout<<"家庭住址:"<<pHa; 需要先判断 pHa 是否是合法字符串。

int main()
中 per3=per1 调用 operator= 成员,但你没实现它的深度拷贝。
2020-11-09 09:01
快速回复:类的深复制构造函数/没有错误,运行不出结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020422 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved