2013级C++第7周(春)项目——深复制、友元、模板 【项目1-深复制体验】

/*
* 程序的版权和版本声明部分
* Copyright (c)2013, 在校学生
* All rightsreserved.
* 文件名称: 项目1.cpp
* 作    者:刘旺
* 完成日期:2014年4月8日
* 版本号: v1.0
*
* 输入描述:
* 问题描述:阅读下面的程序,补足未完成的注释
* 程序输出:
* 问题分析:
*/
#include <iostream>
#include <cstring>
using namespace std ;

class A{
private:
        char *a ;
public :
        A(char *aa)
        {
            a = new char[strlen(aa)+1] ;//这样处理的意义在于:为成员指针初始化开辟空间防止指针的乱指向问题
            strcpy(a,aa) ;//数据成员a与形式参数aa的关系:a是aa的备份,a复制了aa的内容
        }
        ~A()
        {
            delete []a ;//这样处理的意义在于释放开辟的动态内存防止内存的泄露
        }
        void output()
        {
            cout << a << endl ;
        }
};

int main ()
{
    A a("good moring, code monkeys!") ;
    a.output() ;
    A b("good afternoon, codes!") ;
    b.output() ;
    return 0 ;
    return 0 ;
}

问题(2):2、将注释(1)所在的那一行去掉,会出现什么现象?为什么?为什么a数据成员所占用的存储空间要在aa长度基础上加1?

答:出现的现象是程序在执行时直接崩溃。因为指针a没有被初始化没有指向的内存所以拷贝的东西也不知道储存到哪里。加1是因为字符串后面会自动添加一个‘\0’字符。

问题(3):为类A增加复制构造函数:

/*
* 程序的版权和版本声明部分
* Copyright (c)2013, 在校学生
* All rightsreserved.
* 文件名称: 项目1.cpp
* 作    者:刘旺
* 完成日期:2014年4月8日
* 版本号: v1.0
*
* 输入描述:
* 问题描述:阅读下面的程序,补足未完成的注释
* 程序输出:
* 问题分析:
*/
#include <iostream>
#include <cstring>
using namespace std ;

class A{
private:
        char *a ;
public :
        A(char *aa)
        {
            a = new char[strlen(aa)+1] ;//这样处理的意义在于:为成员指针初始化开辟空间防止指针的乱指向问题
            strcpy(a,aa) ;//数据成员a与形式参数aa的关系:a是aa的备份,a复制了aa的内容
        }
        A(const A &p)//深复制构造函数
        {
             a = new char[strlen(p.a)+1] ;
             strcpy(a,p.a) ;
        }
        ~A()
        {
            delete []a ;//这样处理的意义在于释放开辟的动态内存防止内存的泄露
        }
        void output()
        {
            cout << a << endl ;
        }
};

int main()
{
    A a("good morning, code monkeys!");
    a.output();
    A b(a);
    b.output();
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值