您的位置:首页 > 编程语言 > C语言/C++

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

2012-11-24 17:28 190 查看
/*假如一个人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
则delete [],是new(i)则delete.

2)类:new delete会调用类的构造/析构函数,free则不会。

3)重载:malloc free一般不进行重载,new delete的运算符还是函数都可以重载,添加一些功能,或者去掉一些功能。

共同点:

本质:返回都要进行判断是否为NULL;删除都只是删除动态的内存堆,指针栈还存在,需要将p=NULL。

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: