对象C++例.docx
《对象C++例.docx》由会员分享,可在线阅读,更多相关《对象C++例.docx(36页珍藏版)》请在冰豆网上搜索。
对象C++例
用类型说明的类型名,使用时不用冠以类型说明符
例1.
typedefenum{red,green,yellow}traffic_light_color
structintersection{
traffic_light_colortraffic_light;
intnumber_cars_queued;
intcumulative_num_cars
}
intersectionnetworks[50];
------------------------------------------------------------------------
枚举值转换为整型值是自动转换,而整型值转换为枚举值需要强制转换
例2
enumname{john,mike,rose,joan}
nameperson1=john;
nameperson2=1;
nameperson2=(enum,name);
------------------------------------------------------------------------
允许无名联合
例3.
union{
inti;
floatf;
};
------------------------------------------------------------------------
增加了作用域运算符:
:
例4.
charch;
main()
{
hide_identifider();
printf(“\n\nglobalvalueofoh=%c”,ch);
}
voidhide_identifier()
{
charch=’e’
printf(“\nthelocalvalueofch=%”,cj);
…
:
:
ch=’a’
}
输出结果为:
thelocalvalueofch=e
theglobalvalueofch=a
强制类型转换可采用函数形式
例5.
longl=(long)f;
可写作:
longl=long(f);
------------------------------------------------------------------------
增加了类型说明new和delete
例6.
voidcreat_string()
{
intnum_char;
printf(“howmanycharacterinyourfirst_name:
”;
scanf(“%d,&num_chars);
char*name=newchar[num_chars+1];
printf(“enteryourfirstname:
”);
scanf(“%s”,name);
printf(“\n\nyourfirstname,%s,isverynice!
”,name);
deletename;
}
------------------------------------------------------------------------
main()
{
create_string();
…
}
------------------------------------------------------------------------
关于函数部分的给边和扩充
原形函数
例7.
main()
{
inti=4,j=5;
function(i,j);
}
voidfunction(c,d)(原C语言的函数形式)
intc,d;
{
printf(“\nc=%d,d=%d,”c,d)
}
voidfunction(intc,intd)(C++语言的函数形式)
{
printf(“\nc=%d,d=%d,”c,d);
}
缺省参数的函数
例8.
voidfunc(inta=0,charb=’c’,intd=10)
{
…
}
下面的写法都允许
func(12)
func(12,‘w’)
func()
func(12,‘kk’,30)
------------------------------------------------------------------------
允许不限定参数个数的函数定义
例9.
intprint(char*…)
------------------------------------------------------------------------
内联函数说明
例10.
main()
{
inti=4,j=5;
inlinefunction(i,j);
}
voidfunction(inta,intb)
{
…
}
------------------------------------------------------------------------
关于函数调用市的参数传递——引用类型
例11.(用C语言写交换两个字符的函数)
voidswap(v1,v2)
int*v1,*v2;
{
inttemp;
temp=*v;
*v1=*v2,
*v2=temp;
}
main()
{
inti=7,j=8;
swap(&i,&j);
…
}
(用C++语言写交换两个字符的函数)
voidswap(int&v1,int&v2)
{
inttemp;
temp=v1;
v1=v2;
v2=temp
}
main()
{
inti=7,j=8;
swap(i,j);
….
}
------------------------------------------------------------------------
关于函数名重载
例12.(使用C语言的情况)
intcube(intnumber)
floatfcube(floatnumber)
doubledcube(doublenumber)
(使用C++语言的情况)
intcube(intnumber)
floatcube(floatnumber)
doublecube(doublenumber)
类、对象和消息
class<类名>{
[private:
<私有数据成员和函数成员表>]
[protected:
<保护数据成员和函数成员表>]
[public:
<公有数据成员和函数成员表>]
}[对象表];
------------------------------------------------------------------------
例1.(类的说明)
classpoint{
private:
intx;
inty;
public:
intgetx(){returnx;}
}
------------------------------------------------------------------------
classpoint{intx,y;
public:
intgetx();
};
intpoint:
:
getx(){returnx;}
------------------------------------------------------------------------
例2.(对象的定义)
pointorigin;
pointrow[80];
point*point_ptr;
vectormultiply(vector&v1,vector&v2)
{
…
}
------------------------------------------------------------------------
例3.(向对象发消息)
origin.getx();
point_ptr→getx();
构造函数和析构函数
例4.
classpoint{
intx,y;
public:
intgetx(){returnx;}
point(inta,intb);
point(chara,charb);
}
point:
:
point(inta,intb)
{
x=a;
y=b;
}
point:
:
point(chara,charb)
{
x=int(a);
y=int(b);
}
------------------------------------------------------------------------
例5.(一个整数栈类的说明)
classstack{
private:
int*top;
int*bottom;
public:
stack(){top=bottom=newint[100];}
voidpush(intc){if((top_bottom)<100)*top++=c;}
intpop(){if(--top>=bottom)return*top;}
~stack(){deletebottom;}
};
------------------------------------------------------------------------
使用整数栈类的例子——字母顺序反向
main()
{
charyour_string[20];
printf(“\nenteryourstring:
”);
scanf(“%s”,your_string);
printf(“\nyourstringisreversed%s”,reverse_str(your_string));
}
------------------------------------------------------------------------
char*reverse_str(char*string);
{
stacks;
char*re_ptr;
for(inti=0;ire_ptr=newchar[strlen(string+1)];
for(inti=0;ire_ptr[strlen(string)]=’\0’;
returnre_ptr;
}
--------------------------------------------------------------------
关于复制构造函数
例6.
classpointer{
intx,y;
public:
pointer(intcx,intcy){x=cx;y=cy;}
pointer(constpointer&p){x=p.x;y=p.y;}
}
voidmain()
{
pointerob1(40,50);
pointerob2=ob1;
…
}
pointersamp()
{
pointertemp(20,10);
…
returntemp;
}
------------------------------------------------------------------------
例7.另一个带有复制构造函数的类说明
classsample{
private:
char*pointer_char;
public:
sample(){pointer_char=NULL;}
sample(char*str){pointer_char=newchar[strlen(str)+1];
strcpy(pointer_char.str);}
sample(sample&ob){pointer_char=new[strlen(ob.pointer_char)+1];
strcpy(pointer_char,ob.pointer_char);}
~sample(){in(ponter_char!
=NULL)deletepointer_char;}
}
类说明中的数据成员是对象(属性是对象)
例8.(输入类)
classinner_class
{
intx;
public:
inner_class(intz){x=z;}
voidwrite(){printf(“%d\n”,x);
};
(输出类中有输入类对象)
classouter_class
{
inty;
inner_classg,h;
public:
outer_class(intz);
voidwrite(){printf(“%d\n”,y);}
voidwrite_inner_g();
voidwrite_inner_h();
};
outer_class:
:
outer_class(intz):
a(20),b(-36){y=z;}
outer_class:
:
write_inner_g(){g.inner_class:
:
write();}
outer_class:
:
write_inner_h(){h.inner_class:
:
write();}
main()
{
outer_classob(22);
ob.write_inner_g();
ob.write_inner_h();
}
也可以这样来定义输出类的构造函数
outer_class:
:
outer_class(x,y,z){y=x;
g.inner_class(y);
h.inner_class(z);
}
定义输出类对象ob:
outer_classob(22,20,-36);
对象数组
例9.
classpoint{
private:
intx,y;
public:
point(inta=0,intb=0){x=a;y=b;}
point(){init(0,0),}//不带参数的构造函数才能定义对象数组
voidinit(inta,intb){x=a;y=b;}
intx_cord(){returnx;}
inty_cord(){returny;}
};
main()
{
pointedata(3,4);
printf(“\nx=%dy=%d”,data.x_cord(),data.y_cord());
pointem_data[20];//因为有不带参数的构造函数,此句才是正确的
printf(“\nthexcoordinateofindex18=%d”,m_data[18].x_cord());
}
------------------------------------------------------------------------
类的自引用和this指针
例10.
classdog
{
dog*body;
dog*tail;
charname;
publicdog(char*dig_name)
{name=newchar[dog_name+1];
strcpy(name,dog_name);
tail=body=0;}
char*dog_name(){returnname;}
voidcreate_tail(char*type_tail)
{tail=newdog(type_tail);
tail->body=this;}
char*get_type_tail(){returnthis->tail->dog_name();}
};
main()
{
dogsheep_dog("rover");
sheep_dog.creat_tail("furry");
printf("\nThenameofthedogis%s",sheep_dog.dog_name());
printf("\nThetypeoffailis%s",sheep_dog.get_type_tail());
}
关于类属类
例11.定义一个类属的链表类
templateclasslist{
data_tdata;
list*next;
public:
list(data_td);{data=d;
next=0;}
voidadd(list*node){node→next=this;
next=0;}
list*getnext(){returnnext;}
data_tgetdata(){returndata;}
};
intmain()
{
liststar(‘a’);
list*p,*last;
inti;
last=&start;
for(i=1;i<26;i++){p=new(list(‘a’+i);
p→add(last);
last=p;}
p=&start;
while(p){printf(“%c\n”,getdata());
p=p→getnext();}
return1;
}
对象作为函数参数
例12.
classsamp{
char*s;
public:
samp(){s=’\0’;}
~samp(){if(s)delete[]s;
printf(“freeings\n”);}
voidshow(){printf(“%s\n”,s);}
voidset(char*str){s=newchar[strlen(str)+1];
if(!
s){printf(“allocationerror\n”);
exit
(1);}
strcpy(s,str);}
};
voidinput(samp&obj)
{
chars[80];
printf(“enterastring:
”);
scanf(“%s”,s);
obj.set(s)
}
main()
{
sampob;
input(ob);
ob.show();
}
------------------------------------------------------------------------
一种错误方式
sampinput()
{
chars[80];
samptemp;
printf(“enterastring:
”);
scanf(“%s”,s);
temp.set(s);
returntemp;
}
main()
{
sampob;
ob=input();
ob.show();
}
友元函数
例13.(矢量类说明)
classvector{
intv[n];
…
public:
elem(inti){………}//得到指定位置的元素泍作
friendmultiply(matrix&,vector&,int);
…
};
------------------------------------------------------------------------
(矩阵类说明)
classmatrix{
intm[][];
public:
elem(intiintj){…..}//得到指定位置的元素操作
friendmultiply(matrix&,vector&,int);
…
};
------------------------------------------------------------------------
计算矢量与矩阵的乘积函数
vectormultiply(matrix&m,vector&v,intn)
{
vectorr;
for(inti=0;i<(n-1);i++)
{
r.elem(i)=0;//加入友员说明后可以改为:
r.v[i]=0;
for(intj=0;j<(n-1);j++)r.elem(i)+=m.elem(i,j)*v.elem(j);//加入友员说明后可以改为:
//r.v[i]+=m.m[i][j]*v.v[j];
}
returnr;
}
------------------------------------------------------------------------
类的静态成员
例14.
classmyclass{
staticintm_count;
public:
staticintget_count(){returnm_count;}
staticvoidadd(){m_count++;}
}
intmyclass:
:
m_count=0;
程序可以直接使用类说明中的函数:
main()
printf(“count=%d\n”,myclass:
:
get_count());
for(intj=0;j<4;j++)myclass:
:
add();
printf(“count=%d”,myclass:
:
get_count());
}
关于继承
导出类
例1.(二维坐标系中的点类)
classbase_class
{
private:
floatx,y;
public:
voidassign(floatx1,floaty1){x=x1;
y=y1;}
floataccess_x(){returnx;}
floataccess_y(){returny;}
voidprint(){printf("x=%fy=%f",x,y);}
};
-----------------------------------------------------------------------------