};
stringsstrings:
:
operator+(strings&a)
{
stringss;
strcpy(s.name,name);
strcat(s.name,a.name);
returns;
}
intmain()
{
stringsstr1="abcd",str2="cdef";
stringsb;
b=str1+str2;
b.out();
return0;
}
例:
两个复数相加运算。
#include"iostream.h"
classcomplex
{
public:
complexoperator+(complexa);
voidinput(floatm,floatn);
voidoutput();
private:
floati,j;
};
complexcomplex:
:
operator+(complexa)
{
complext;
t.i=i+a.i;
t.j=j+a.j;
returnt;
}
voidcomplex:
:
input(floatm,floatn)
{
i=m;j=n;
}
voidcomplex:
:
output()
{
if(j>=0)
cout<
else
cout<
}
main()
{
complexa1,a2,a3;
a1.input(10,20);
a2.input(5,-5);
a3=a1+a2;
a3.output();
}
例:
重载new和delete运算符。
例1:
#include"iostream.h"
#include"stddef.h"
classmemmanager
{
public:
void*operatornew(size_tsize);
void*operatornew(size_tsize,chartag);
voidoperatordelete(void*p);
};
void*memmanager:
:
operatornew(size_tsize)
{
cout<<"new1operator"<char*s=newchar[size];
//cout<//*s='a';
returns;
}
void*memmanager:
:
operatornew(size_tsize,chartag)
{
cout<<"new2operator"<char*s=newchar[size];
*s=tag;
returns;
}
voidmemmanager:
:
operatordelete(void*p)
{
cout<<"deleteoperator"<delete(char*)p;
//char*s=(char*)p;
//delete[]s;
}
voidmain()
{
memmanager*m=newmemmanager();
deletem;
memmanager*n=new('B')memmanager;
deleten;
}
例2:
#include"iostream.h"
#include"malloc.h"
classrect
{
private:
intlength,width;
public:
rect(intl,intw)
{length=l;width=w;}
voiddisp()
{cout<<"矩形的面积是:
"<void*operatornew(size_tsize);
voidoperatordelete(void*p);
};
void*rect:
:
operatornew(size_tsize)
{
cout<<"重载new运算符分配内存\n";
returnmalloc(size);
}
voidrect:
:
operatordelete(void*p)
{
cout<<"重载delete运算符释放内存\n";
free(p);
}
voidmain()
{
rect*p=newrect(5,9);
p->disp();
deletep;
}
七、类型转换
1.隐式转换
2.显式转换
格式:
(类型名)表达式
八、模板
1.函数模板
格式:
template
返回类型函数名(模板形参)
{
函数体;
}
例:
将求两数中大的数定义为函数模板
template//class可写为typename
Tmax(Tx,Ty)
{
return(x>y)?
x:
y;
}
模板的使用:
(1)一个类型参数的函数模板
#include“iostream.h”
template
Tmax(Tx,Ty)
{
return(x>y)?
x:
y;
}
main()
{
inti1=3,i2=45;
floatf1=12.5,f2=34.6;
doubled1=7,d2=90;
charc1=’a’,c2=’Y’;
cout<cout<cout<cout<}
(2)有两个参数的函数模板
#include“iostream.h”
template
//template
voidoutput(type1x,type2y)
{
cout<}
main()
{
inti1=3,i2=45;
floatf1=12.5,f2=34.6;
doubled1=7,d2=90;
charc1=’a’,c2=’Y’;
output(i1,i2);
output(f1,f2);
output(d1,d2);
output(c1,c2);
output(i1,c2);
output(i2,f1);
output(f2,d2);
}
2.类模板
格式:
template
class类名
{
//……
};
类模板的使用:
类名<实际的类型>对象名;
#include"iostream.h"
//#include“string”
template//template
classABC
{
public:
voidinput(typea);
//{x=a;}
voidoutput()
{cout<private:
typex;
};
//template
//voidABC:
:
input(typea)
//{x=a;}
//template
//voidABC:
:
output()
//{cout<main()
{
ABCobj1;
obj1.input(23);
obj1.output();
ABCobj2;
obj2.input(45.5);
obj2.output();
ABCobj3;
obj3.input('E');
obj3.output();
//ABCobj4;
//obj4.input(“这是一个模板的示例子”);
//obj4.output();
}
作业:
九、练习
1.关于虚函数,正确的描述是:
A.构造函数不能是虚函数()
B.析构函数不能是虚函数
C.虚函数可以是友元函数
D.虚函数可以是静态成员函数
2.要实现动态联编,派生类中的虚函数:
()
A.返回的类型可以与虚函数的原形不同
B.参数个数可以与虚函数的原形不同
C..参数类型可以与虚函数的原形不同
D.以上都不对
3.如果在基类中将show声明为不带返回值的纯虚函数,正确的写法是:
()
A.virtualshow()=0;
B.virtualvoidshow();
C.virtualvoidshow()=0;
D.voidshow()=0virtual;
4.下面的程序段中虚函数被重新定义的方法正确吗?
为什么?
classbase{
public:
virtualintf(inta)=0;
//...
};
classderived:
publicbase{
public:
intf(inta,intb)
{
returna*b;
}
//...
};
5.分析以下程序的运行结果:
#include
classStock
{
public:
voidprint()
{
cout<<”Stockclass.\n”;
}
};
classDerl_Stock:
publicStock
{
public:
voidprint()
{
cout<<”Der1_Stockclass.\n”;
}
};
classDer2_Stock:
publicStock
{
public:
voidprint()
{
cout<<”Der2_Stockclass.\n”;
}
};
voidmain()
{
Stocks1;
Stock*ptr;
Der1_Stockd1;
Der2_Stockd2;
ptr=&s1;
ptr->print();
ptr=&d1;
ptr->print();
ptr=&d2;
ptr->print();
}
6.修改上一题的程序,使运行结果为:
Stockclass.
Der2_Stockclass.
Der2_Stock