第八周项目33-对类中深复制的体验

(1)

问题及代码:

/*
*Copyright (c) 2015,烟台大学计算机学院
*All rights reserved.
*文件名称:text.cpp
*作者:徐健
*完成日期:2015年4月23日
*版本号:v1.0
*
*问题描述: 不足问完成的注释
*输入描述: 无
*程序输出:
*/
#include<iostream>
#include<cstring>
using namespace std;
class A
{
private:
    char *a;
public:
    A(char *aa)
    {
        a = new char[strlen(aa)+1];  //(a)这样处理的意义在于:对内存合理利用,以免造成内存的浪费
        strcpy(a, aa);  //(b)数据成员a与形式参数aa的关系:a与aa的值相等,将aa的值赋给a
    }
    ~A()
    {
        delete []a;   //(c)这样处理的意义在于:  防止内存泄露
    }
    void output() { cout<<a<<endl; }
};
int main(){
    A a("good morning, code monkeys!");
    a.output();
    A b("good afternoon, codes!");
    b.output();
    return 0;
}

运行结果:

第八周项目33-对类中深复制的体验_第1张图片

知识点总结:

如果将(a)所在的那一行去掉,会使程序崩溃,原因是类中定义的指针变成了野指针。

给a的数据成员所占用的存储空间要在aa长度基础上加1原因是分配一个与aa相同的存储空间,strlen(a)是字符串a的长度,+1是加上'\0'占的一个字节。

(2)

问题及代码:

/*
*Copyright (c) 2015,烟台大学计算机学院
*All rights reserved.
*文件名称:text.cpp
*作者:徐健
*完成日期:2015年4月23日
*版本号:v1.0
*
*问题描述: 为类A增加复制构造函数
*输入描述: 无
*程序输出:输出字符串
*/
#include<iostream>
#include<cstring>
using namespace std;
class A
{
private:
    char *a;
public:
    A(char *aa)
    {
        a = new char[strlen(aa)+1];  //(a)这样处理的意义在于:对内存合理利用,以免造成内存的浪费
        strcpy(a, aa);  //(b)数据成员a与形式参数aa的关系:a与aa的值相等,将aa的值赋给a
    }
    A(A&x)
    {
        a=new char[strlen(x.a)+1];
        strcpy(a,x.a);
    }
    ~A()
    {
        delete []a;   //(c)这样处理的意义在于:  防止内存泄露
    }
    void output() { cout<<a<<endl; }
};
int main()
{
    A a("good morning, code monkeys!");
    a.output();
    A b(a);
    b.output();
    return 0;
}
运行结果:

第八周项目33-对类中深复制的体验_第2张图片

你可能感兴趣的:(第八周项目33-对类中深复制的体验)