【静态类型/动态类型】弱类型、强类型、静态类型和动态类型 静态绑定和动态绑定

 

弱类型、强类型、动态类型、静态类型语言的区别是什么?

 

强类型:偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成doubl 
弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double 
静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。 
动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。譬如说你不能对一个数字a写a[10]当数组用。

 

这里写图片描述

 

弱类型:

> "1"+2
'12'

 强类型:

>>> "1"+2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

动态类型:

>>> a = 1
>>> type(a)
<type 'int'>
>>> a = "s"
>>> type(a)
<type 'str'>

静态类型:

Prelude> let a = "123" :: Int

<interactive>:2:9:
    Couldn't match expected type `Int' with actual type `[Char]'
    In the expression: "123" :: Int
    In an equation for `a': a = "123" :: Int

 

 

 

什么意思?你可能会说你不懂这些最新的面向对象术语;或者,过度劳累的你一时想不起静态和动态绑定的区别。那么,让我们来复习一下。

先说明:静态类型和动态类型==静态绑定和动态绑定,(两者是一个意思,说法不一样而已)嘿嘿
对象的静态类型是指你声明的存在于程序代码文本中的类型。看下面这个类层次结构:
enum ShapeColor { RED, GREEN, BLUE };
// 一个表示几何形状的类

class Shape


...
};
class Rectangle: public Shape


...
};

class Circle: public Shape {

...
};
用图形来表示是下面这样:
       Shape

      /    \

     /      \

    /        \

Rectangle   Circle
现在看看这些指针:
Shape *ps;                 // 静态类型 = Shape*
Shape *pc = new Circle;    // 静态类型 = Shape*
Shape *pr = new Rectangle; // 静态类型 = Shape*
这个例子中, ps, pc,和pr都被声明为Shape指针类型,所以它们都以此作为自己的静态类型。

 

注意,这和它们真的所指向的对象的类型绝对没有关系 ---- 它们的静态类型总是Shape*。

 

对象的动态类型是由它当前所指的对象的类型决定的。即,对象的动态类型表示它将执行何种行为。上面的例子中,pc的动态类型是Circle*,pr的动态类型是Rectangle*。至于ps,实际上没有动态类型,因为它(还)没有指向任何对象。
动态类型,顾名思义,可以在程序运行时改变,典型的方法是通过赋值:
ps = pc; // ps的动态类型 // 现在是Circle*
ps = pr; // ps的动态类型 // 现在是Rectangle*

 

注:虚函数是动态绑定的,意思是说,虚函数通过哪个对象被调用,具体被调用的函数就由那个对象的动态类型决定

 

http://hi.baidu.com/anglecloudy/item/706237fedcef1f5cc9f337cf

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值