/*假如一个人CA把感冒病毒传染给了朋友CB,用这件事写成C++小测试程序,复习下C++的友元,C++的构造和析构函数进行堆内存申请和释放。记得知识点:
(1)类声明了一个友元函数或者友元类,目的是友元函数或者类可以通过该类的对象直接访问它的私有成员。否则可以通过组合,继承实现对该类的公有或者保护成员的访问。
(2)构造函数中,如果要用C形式申请堆内存返回p,注意对p检查、赋初值、越界检测、尽量*p而不是p操作、delete要对应、p=NULL防止多次释放和当野指针使用。
(3)用C++的new/delete,new []/delete[]对及和C堆内存申请间的联系和区别见后面。
*/
#include
#include
using namespace std;
class CA;
class CB //是因为申请用malloc,释放用delete,都不是对应的关系;而且分配内存后要对它进行初始化.
{
private:
char *flow;
char *name;
int age;
bool attack;
friend class CA;
public:
CB();
CB(char *n,int a);
~CB();
void showB();
void setFlow(char *f);
};
CB::CB(){
flow=NULL;
name=NULL;
age=0;
attack=false;
};
CB::CB(char *n,int a){
flow=(char*)malloc(sizeof(char)*50);
if(NULL==flow)
{
cout<<"Allocate memory error."<
exit(1);
}
memset(flow,NULL,sizeof(char)*50);
name=(char*)malloc(sizeof(char)*20);
if(NULL==name)
{
cout<<"Allocate memory error."<
exit(1);
}
strcpy(name,n);
age=a;
attack=false;
}
CB::~CB(){
free(flow);
free(name);
flow=NULL;
name=NULL;
age=0;
attack=false;
}
void CB::setFlow(char *f){
strcpy(flow,f);
attack=true;
}
void CB::showB(){
//
cout<<"感染者的携带病毒为:"<
if(attack==false)
{
cout<<"未感染者的名字为:"<
cout<<"未感染者的年龄为:"<
}
if(attack==true)
{ cout<<"未感染者可能被感染的病毒为:"<
cout<<"被感染者的名字为:"<
cout<<"被感染者的年龄为:"<
}
}
class CA
{
private:
char *flow;
char *name;
int age;
public:
CA();
CA(char*f,char*n,int a);
~CA();
void attack(CB &b);
void showA();
};
CA::CA(char*f,char*n,int a){
flow=(char*)malloc(sizeof(char)*50);
if(flow==NULL)
{
cout<<"Allocate memory error!"<
exit(1);
}
strcpy(flow,f);
name=(char*)malloc(sizeof(char)*20);
if(name==NULL)
{
cout<<"Allocate memory error!"<
exit(1);
}
strcpy(name,n);
age=a;
}
CA::~CA(){
free(flow);
flow=NULL;
free(name);
name=NULL;
age=0;
}
void CA::attack(CB&b){
b.flow=flow;
b.attack=true;
//b.setFlow(flow);
}
void CA::showA(){
cout<<"感染者的携带病毒为:"<
cout<<"感染者的名字为:"<
cout<<"感染者的年龄为:"<
}
void main(){
CB b("Sandy Ou",22);
cout<<"-------The first person----------"<
b.showB();
//b.showB();
CA a("流行性感冒病毒","Jesse Cen",24);
cout<<"-------The second person----------"<
a.showA();
a.attack(b);
cout<<"-------The first person be attack----------"<
b.showB();
cout<<"请关闭程序..."<
while(1) ;//VS 2008 stop
}
/*若使用 new delete申请内存空间:
定义:
1.非自定义类型: new new[]一个空间/连续的空间。// new本身会做类型大小计算,强制类型转换,连续的空间一般是对象指针(4个字节大小)
自定义类型:
new Obj(10)调用有参构造函数;new Obj[10]只能调用无参构造函数(类产生对象new返回指针->,否则是变量对象.)。
2.
判断返回值是否为NULL.比较大数据时候一定要catch(std::bad_alloc &e)异常处理。
使用:
3.
进行*P操作,不进行P操作;若一定要进行,那么记录new原始返回的地址。//原配 错误指向 分手 灾难落幕
释放:
4. 1)
delete delete[] 和new new[]一定要成对出现,只能delete一次,若那个指针赋值了NULL则可以delete N次。。
2)
delete []不管对象数组的维数多少都可以,delete会先调用析构函数,然后释放对象指针堆内存。//new单个元素时,delete delete[]一样
5.
p=NULL,不能delete非NULL指针多次,且防止变成野指针。
注意free和delete delete[]区别:
1)用法:Free对应malloc指针对应即可;delete对应new,如果是new[n]则delete [],是new(i)则delete.
2)类:new delete会调用类的构造/析构函数,free则不会。
3)重载:malloc free一般不进行重载,new delete的运算符还是函数都可以重载,添加一些功能,或者去掉一些功能。
共同点:
本质:返回都要进行判断是否为NULL;删除都只是删除动态的内存堆,指针栈还存在,需要将p=NULL。
*/