第九周上机实践项目 项目1-深复制体验

问题及代码:

(1)阅读下面的程序,补足未完成的注释

#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()
    {
        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;
}

(2)将注释(a)所在的那一行去掉,会出现什么现象?为什么?为什么a数据成员所占用的存储空间要在aa长度基础上加1?若指针a不是指向字符(即不作为字符串的地址),是否有必要加1?

(3)为类A增加复制构造函数,用下面的main函数测试

int main()
{
    A a("good morning, code monkeys!");
    a.output();
    A b(a);
    b.output();
    return 0;
}
/*
 Copyright(c)2016,烟台大学计算机与控制工程学院
  All rights reserced
 文件名称:test.cpp
 作    者:蔡汝佳
 完成日期:2016年5月9日
 版 本 号: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(A &b)
    {
        a=new char[strlen(b.a)+1];
        strcpy(a,b.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;
}

运行结果:

知识点总结:

学习心得:



时间: 2024-08-10 23:11:54

第九周上机实践项目 项目1-深复制体验的相关文章

第九周上机实践项目 项目2-我的数组类

问题及代码: [项目-我的数组类] 阅读程序,请完成成员函数的定义,因为存在指针型的数据成员,注意需要深复制的构造函数. #include<iostream> using namespace std; class MyArray { private: int *arrayAddr; //保存一个有len个整型元素的数组的首地址 int len; //记录动态数组的长度 int max; //动态数组中的最大值(并非动态数组中必须要的数据成员) public: MyArray(int *a, i

第九周上机实践项目 项目3-人数不定的工资类

问题及代码: [项目-人数不定的工资类] 设计一个工资类(Salary),其中的数据成员包括职工人数(number,人数不定)和number个职工的工资salary,要求输入职工工资并逐个输出. 提示:用固定大小的数组存储number个职工的工资,可能造成空间的浪费,也可能会由于空间不够而不能处理职工人数过多的应用.将salary声明为指针类型的成员,通过动态分配空间,分配正好大小的空间存储数据. class Salary { public: Salary(int n); //n为职工人数,初始

第九周上机实践项目2——Time类中的运算符重载(续)

在Time类中的运算符重载基础上 (1)定义对时间对象的自增和自减一目运算符 //一目运算符的重载 CTime operator++(int);//后置++,下一秒 CTime operator++();//前置++,下一秒,前置与后置返回值不一样 CTime operator--( int);//后置--,前一秒 CTime operator--();//前置--,前一秒 (2)定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起

第九周上机实践项目4——我的向量类

建立一个向量类MyVector,声明如下,请完成类的定义 class MyVector //定义向量类 { public: MyVector(int m); //构造函数,共有m个元素的向量,元素值预置为0 MyVector(const MyVector &v); //复制构造函数 ~MyVector(); //析构函数:释放动态数组所占用的存储空间 friend istream &operator>>(istream &input, MyVector &d);

【c++】第十二周上机实践作业 项目 2

/* *copyright(c) 2016,烟台大学计算机学院 *All rights reserved *文件名称:test.cpp *作者:谭泽纯 *版本:v6.0 * *问题描述: 实现Time类中的运算符重载. <code class="hljs cpp has-numbering"><span class="hljs-keyword">class</span> CTime { <span class="h

第九周项目1—深复制体验(1)

问题及代码: /* *Copyright(c) 2016.烟台大学计算机与控制工程学院 *ALL rights reserved. *文件名称:main.cpp *作者:郝昱猛 *完成日期:2016年5月10日 *问题描述: 深复制体验 */ #include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = new char[

第九周项目1—深复制体验(2)

问题及代码: /* *Copyright(c) 2016.烟台大学计算机与控制工程学院 *ALL rights reserved. *文件名称:main.cpp *作者:郝昱猛 *完成日期:2016年5月10日 *问题描述:深复制体验,增加复制构造函数 */ #include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = n

第十一周上机实践项目2——职员有薪水了(2)

(2)字符串除了用C++扩充的string类型外,按C语言的传统,还可以用char 表示.请将类声明中的string全部改为char 后,重新写一遍程序(此时的区别是,类中有指针成员,构造和析构函数需要考虑深复制的问题了.) 代码 #include <iostream> #include <cstring> using namespace std; class CPerson { protected: char* m_szName; char* m_szId; int m_nSex

第六周上机实践项目2——我的数组类

问题及代码 下面的程序,因为存在指针类型的数据成员,需要能完成深复制的构造函数.请补充完整构造函数和析构函数(其他不必动).其中,构造函数要完成下面三个任务: (1)为各成员函数赋值,按照深复制原则,其中arrayAddr应该是为保存数据新分配的连续空间的首地址: (2)MyArray(int *a, int n)中,要将a指向的数组中的数值,逐个地复制到新分配的arrayAddr指向的空间中: (3)getMax( )函数采取的策略是直接返回max(所以,计算max的工作,由构造函数完成) /