/*
* 程序的版权和版本声明部分
* 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;
}