静态型别和动态型别

原创 2001年12月30日 09:23:00

静态型别和动态型别

概念

所谓静态型别,指的是变量声明的类型;而动态型别是变量实际指向的类型。

特性

  1. 静态型别静,一经确定再无更改;动态型别动,会根据实际指向而改变。
  2. 静态型别控制静态绑定,动态型别控制动态绑定。

例如:

class B;

class D:public B;

B * pB;    //静态型别是B,动态型别未知

B b;    //静态型别是B,动态型别是B

D * pD;    //静态型别是D,动态型别未知

D d;    //静态型别是D,动态型别是D

/* 至此,上面各变量的静态型别已经固定了,b和d的动态型别也固定了;而指针变量的动态型别可能变化。*/

pB = &b;    //pB动态型别为B

pB = &d;    //pB动态型别为D

pD = (D *)&b;    //pD动态型别为B

pD = &d;    //pD动态型别为D

b = d;    //b的静态型别是B,动态型别是B

除了虚函数是动态绑定之外,其余的均为静态绑定(如:缺省参数<包括虚函数的缺省参数!>)。

测试用例

#include <iostream.h>

class B
{
public:
    void f()
    {
        cout<<"Bf"<<endl;
    }
    virtual void v()
    {
        cout<<"Bv-"<<c<<endl;
    }
};
class D:public B
{
public:
    void f()	
    {
        cout<<"Df"<<endl;
    }
    virtual void v()	
    {
        cout<<"Dv-"<<c<<endl;
    }
};

void main()
{
    B b,*pB;
    D d,*pD;

    pB = &d;
    pB->f();
    pB->v();

    pD = (D *)&b;
    pD->f();
    pD->v();
}

输出如下:

Bf
Dv-B
Df
Bv-D

C++ STL迭代器相应型别的推导总结

在算法设计中,经常需要获取迭代器的相应型别,即迭代器所指对象的类型。C++中的RTTI typeid()可以获取型别的名称,但是无法拿它用来声明对象。 这里总结以下迭代器相应型别的获取方法。 一 利用...
  • gettogetto
  • gettogetto
  • 2016年06月03日 17:13
  • 761

代码的坏味道之九 :Primitive Obsession(基本型别偏执)

大多数编程环境都有两种数据:结构型别(record types)允许你将数据组织成有意义的形式;基本型别(Primitive type)则是构成结构型别的积木块。结构总是会带 来一定的额外开销。它们有...
  • yuwei629
  • yuwei629
  • 2013年05月02日 18:15
  • 818

非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?

非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A? 答: a. class B : public A { ……} // B公有继承自A,可以是间接继承的 b. class B {...
  • bxyill
  • bxyill
  • 2012年12月27日 16:35
  • 1201

stl之迭代器相应型别

Partial Specialization(偏特化)的意义 Partial Specialization意思是提供另一份template定义式,而其本身仍为templatized。 针对(任...
  • wangfengfan1
  • wangfengfan1
  • 2015年07月08日 14:16
  • 517

《STL源码剖析》—— 空间配置器(三)

一、空间的配置与释放,std::alloc         对象构造前的空间配置和对象析构后的空间释放,由负责,SGI对此的设计哲学如下:         1. 向 system heap 要求空...
  • bolike
  • bolike
  • 2014年02月19日 22:11
  • 1064

stl之再看迭代器iterator(迭代器相应型别和iterator_traits特性以及traits特性萃取)

stl之再看迭代器iterator(迭代器相应型别和iterator_traits特性以及traits特性萃取)...
  • cow0377
  • cow0377
  • 2014年12月03日 15:21
  • 377

模板之型别对型别的映射

假设 Widget 类定义是我们不能修改的类型: class Widget { public: Widget(int arg, int i = -1) { } ....
  • renwotao2009
  • renwotao2009
  • 2014年11月18日 10:33
  • 593

重新组织数据之十三 :Replace Type Code with Class(以类取代型别码)

class 之中有一个数值型别码( numeric type code ),但它并不影响class 的行为。 以一个新的class 替换该数值型别码(type code)。 动机(...
  • yuwei629
  • yuwei629
  • 2013年05月07日 09:04
  • 436

C++中侦测内嵌型别

请先阅读http://blog.csdn.net/pongba/archive/2004/08/24/82783.aspx简介:如何判定一个类型内部是否已经定义了某个内置类型,然后据此进行专门或者默认...
  • zy498420
  • zy498420
  • 2010年08月17日 18:04
  • 809

System.Net.Dns的型別初始設定式發生例外狀況

在公司自己的ERP系統開發過程中遇到 System.Net.Dns的型別初始設定式發生例外狀況 問題:在一個程序中用到了  ...
  • kaixin110
  • kaixin110
  • 2007年05月28日 11:39
  • 3420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:静态型别和动态型别
举报原因:
原因补充:

(最多只允许输入30个字)