C++构造、析构函数和友元类小总结

/*假如一个人CA把感冒病毒传染给了朋友CB,用这件事写成C++小测试程序,复习下C++的友元,C++的构造和析构函数进行堆内存申请和释放。记得知识点:
(1)类声明了一个友元函数或者友元类,目的是友元函数或者类可以通过该类的对象直接访问它的私有成员。否则可以通过组合,继承实现对该类的公有或者保护成员的访问。

(2)构造函数中,如果要用C形式申请堆内存返回p,注意对p检查、赋初值、越界检测、尽量*p而不是p操作、delete要对应、p=NULL防止多次释放和当野指针使用。

 (3)用C++的new/delete,new []/delete[]对及和C堆内存申请间的联系和区别见后面。

*/
#include<iostream>
#include<cstring>
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."<<endl;
exit(1);
}
memset(flow,NULL,sizeof(char)*50);
name=(char*)malloc(sizeof(char)*20);
if(NULL==name)
{  
cout<<"Allocate memory error."<<endl;
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<<"感染者的携带病毒为:"<<flow<<endl;
if(attack==false)
{
cout<<"未感染者的名字为:"<<name<<endl;
cout<<"未感染者的年龄为:"<<age<<endl;
}
if(attack==true)
{   cout<<"未感染者可能被感染的病毒为:"<<flow<<endl;
cout<<"被感染者的名字为:"<<name<<endl;
cout<<"被感染者的年龄为:"<<age<<endl;
}
}
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!"<<endl;
exit(1);
}
strcpy(flow,f);
name=(char*)malloc(sizeof(char)*20);
if(name==NULL)
{
cout<<"Allocate memory error!"<<endl;
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<<"感染者的携带病毒为:"<<flow<<endl;
cout<<"感染者的名字为:"<<name<<endl;
cout<<"感染者的年龄为:"<<age<<endl;

}

void main(){
CB b("Sandy Ou",22);
cout<<"-------The first person----------"<<endl;
b.showB();
//b.showB();
CA a("流行性感冒病毒","Jesse Cen",24);
cout<<"-------The second person----------"<<endl;

a.showA();

a.attack(b);
cout<<"-------The first person be attack----------"<<endl;
b.showB();
cout<<"请关闭程序..."<<endl;
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。
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值