3-2
老王:EnderPearl?
EnderPearl:在
老王:赶紧教我
EnderPearl:好好好
EnderPearl:这样,我们先来讲故事……
老王:我又不是小孩
EnderPearl:乖~~别闹
老王:……
C++诞生于1883年
其创作者——被誉为”C++之父的”Bjarne Stroustrup,以语言的实用性为标准,在C语言的基础上添加了类,引入了面向对象中特有的继承,多态的概念
在C++语言正式诞生之后,他又添加了模板来支持泛型编程
老王:额……
EnderPearl:C++支持结构化编程,面向对象编程,泛型编程等多种编程方式
老王:为啥打程序还要看女朋友?
EnderPearl:……
EnderPearl:不是那个对象啦~~ 一看就是情场失意的人
EnderPearl:这里的对象,指一个具体的东西。用专业的说法,叫作实例
EnderPearl:比如说,我们抽象出人这样一个类,那我们就可以说,老王是一个对象
老王:* * *
EnderPearl:你是不是爆粗口了
EnderPearl:好了我们来讲讲上面几种编程方式
结构化编程
结构化编程,就是让程序一步一步运行
比如这样
a=readint() //输入
b=readint() //输入
c=a+b //求和
write(c) //输出
就是执行输入,输入,求和,输出这样一个流程
再比如说复数的乘法
a1=readfloat()
b1=readfloat()
a2=readfloat()
b2=readfloat()
//(a1+b1i)(a2+b2i)=a1a2+a1b2i+a2b1i-b1b2
a3=a1*a2-b1*b2
b3=a1*b2+a2*b1
write(a3)
write(' ')
write(b3)
只是,虽然看得懂,但难道每次都得写a1*a2-b1*b2
和a1*b2+a2*b1
吗?而且如果不小心打成a1*a2+b1*b2
了怎么办啊
所以我们有解决办法了:
function complex_multiplication(a1,b1,a2,b2): //定义函数
return (a1*a2-b1*b2,a1*b2,a2*b1) //返回语句
function writeln_complex(a,b):
write(a)
write(' ')
writeln(b)
a1=readfloat()
b1=readfloat()
a2=readfloat()
b2=readfloat()
(a3,b3)=complex_multiplication(a1,b1,a2,b2) //调用函数
writeln_complex(a3,b3)
然而还是有大量代码,而且complex_multiplication
这名字也相当奇怪
而且关键是,我们现在的代码仍然是把实部和虚部分开处理的
所以……
面向对象
我们可以用面向对象的方法:
class complex: //定义类
public function complex(a=0.0,b=0.0): //定义构造函数
m_a=a
m_b=b
public function static read(): //静态成员函数
a=readfloat()
b=readfloat()
return complex(a,b)
public function writeln():
write(m_a)
write(' ')
writeln(m_b)
public function operator*(other): //重载运算符
return (m_a*other.m_a-m_b*other.m_b,m_a*other.m_b+other.m_a*m_b)
private m_a //私有成员
private m_b
x=complex.read() //调用静态成员函数
y=complex.read()
(x*y).write() //调用成员函数
老王:原来面向对象是这个意思……
EnderPearl:说说看,什么意思?
老王:就是把一个东西抽象出来,创造一种新的类型
EnderPearl:蛮聪明的嘛差不多对了
EnderPearl:在这个程序里,我们把复数集抽象出来,定义了一个复数类(complex),每一个复数(例如1+2i)都是这个类的实例
泛型编程
EnderPearl:接下来讲泛型编程
老王:泛型编程是什么
EnderPearl:就是让具体的操作脱离于具体的类型
EnderPearl:比如我们想创建一个max函数,返回两个数中的较大值
function max(a,b):
return a<b?b:a
EnderPearl:于是,我们就可以用多种类型的变量来调用函数
x=max(3,2) //x==3
y=max(0.4,0.9) //y==0.9
z=max('K','O') //z=='O'
class rational:
public rational(a=0,b=1):
//...
public operator<(other):
//...
//...
r=max(rational(3,2),rational(2,3)) //r==rational(3,2)
老王:这个max函数与普通函数好像并没有什么区别啊
EnderPearl:那是因为这次我们的伪代码是动态类型的,引用不区分类型,所以参数的类型是任意的,普通函数也能达到泛型的效果
EnderPearl:但如果是静态类型的可就不是一回事了
function int max(int a,int b):
return a<b?b:a
int x=max(3,2) //x==3
float y=max(0.4,0.9) //Error:expect an integer,not a float
那怎么办?
老王:再打一个
好主意,我们可以重载函数:
function int max(int a,int b):
return a<b?b:a
function float max(float a,float b): //重载函数
return a<b?b:a
int x=max(3,2) //x==3
float y=max(0.4,0.9) //y==0.9
但问题又来了:
char z=max('K','O') //Error:expect an integer or a float,not a character
再打一个???
老王:我不打了……
所以我们得使用模板:
function type max<type>(type a,type b):
return a<b?b:a
int x=max(3,2) //x==3
float y=max(0.4,0.9) //y==0.9
char z=max('K','O') //z=='O'
class rational:
public function rational(int a=0,int b=1):
//...
public function operator<(rational other):
//...
//...
rational r=max(rational(3,2),rational(2,3)) //r==rational(3,2)
EnderPearl:再比如说,队列
老王:队列是啥?
EnderPearl:你排过队吗???肯定没有
<–出队 1 2 3 4 5 入队<–
为了实现它,我们可以这样:
class queue<type>:
public function queue():
//...
//...
queue<int> qi
queue<float> qf
在这里,我们使用了一个模板类。正如你所看到的,我们可以用多种类型来使用queue
EnderPearl:C++支持多种编程方式,也就让它成为非常强大的语言
老王:难怪那么难学……
(未完待续……)
下一篇:开始学习C++
如果你觉得这篇文章很好的话,可以给我打赏
不会花你钱的,只是用你的CPU提供1024个Hash