跟着EP学C++(2nd) C++简介

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*b2a1*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

猜你喜欢

转载自blog.csdn.net/qq_37422196/article/details/79415056