码迷,mamicode.com
首页 > 其他好文 > 详细

typeid关键字

时间:2016-03-22 11:54:08      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

这么看下去太要命了,有太多东西要学了。。。

而且视频看起来的确费神,费脑,费耳朵。

所以决定由视频驱动转向代码驱动。主攻vsc++然后先把界面东西做出来,然后在想后面的东西。

所以今天

【先上来看了一个关键字, typeid,返回的是动态加载之后的变量或者对象的类型。

我记得跟之前我看到的一个java里面的number类里面的有一部分的描述很像。关于这个number到底是 int或是 double 或者 long 说是 short 说 float。嗯 我记得就5个子类】

 

然后附上typeid的相关资料。

http://baike.baidu.com/link?url=hb_GGrSnTI0gVWEFqM7ls0UjyOUQfaosa8lNRCB3f0_yUMWY9X16oh1jrzGXrd3w4_5BD43csVHItm-PJlb_rTsdiY0zlR_adRd_XuQ2V4W

//百科上有谬误。

 

示例代码:

#include <iostream>
void main()
{
    double db = 10.9;
    double *pdb = &db;
    auto num = pdb;//通用传入接口
    std::cout << typeid(db).name() << std::endl;
    std::cout << typeid(num).name() << std::endl;
    std::cout << typeid(pdb).name() << std::endl;
    //typeid(db).name()  db2;
    decltype(db) numA(10.9);//通用的备份接口
    std::cout << sizeof(numA) <<"    "<< numA << std::endl;
    system("pause");
}

运行结果:

double

double *

double *

8    10.9

源码理解:

尝试:

1、双击db,发现这个db就是 在double db = 10.9,里面声明的。

2、把db改成int 

发现:

技术分享

这里应该是使用一个我们声明过的变量的名字。

3所以pdb我们也声明过,所以把int 改成 pdb

技术分享

pdbdouble *类型的,所以10.9 这个double型的值不能被初始化成double * 类型的,所以会报错。

以上为简单的decltype,和typeid的使用。

自己敲一遍加深印象:

技术分享

http://www.cppblog.com/smagle/archive/2010/05/14/115286.html

 

原文写得很容易看懂。蓝字很重要,上面的官话可以扫一眼。

主要看例程。

下面的题目需要加上.name() 否则编译通不过。

 

注意百度百科这里有错误。

技术分享

写在主函数里面跟写在主函数外面是有区别的。

技术分享

以下为自己的代码,还是少写字,多看代码多敲代码比较靠谱,留下注释。

如此便好。

 

代码1

#include <iostream>
using namespace std;

void main(){

    //Part A.
    int i = 3;
    int *pi = &i;
    cout << typeid(i).name() << endl;
    cout << typeid(pi).name() << endl;

    decltype(i) num(6);
    cout << num <<" "<< typeid(num).name() << endl;

    cout << "Part B." << endl;
    class Base1 {};
    class Derive1 :public Base1 {};
    Derive1 d1;
    Base1& b1 = d1;
    cout << typeid(b1).name() << endl;//?AVBase1@?1?main@
    cout << typeid(d1).name() << endl;//?AVDerive1@?1?main@

    cout << "Part C." << endl;
    class Base2 {
        virtual void fun(void) {}
    };
    class Derive2 :public Base2 { };
    Derive2 d2;
    Base2& b2 = d2;
    cout << typeid(b2).name() << endl;




    cout << "Part D." << endl;
    class Derive22 :public Base2 { }; //Base2 里面有一个虚函数。
    Derive2* pb1 = dynamic_cast<Derive2*>(&b2);//Derive2 共有的继承了Base2.
    Derive22* pb2 = dynamic_cast<Derive22*>(&b2);
    cout << pb1 << endl;//可以转化指向一个具体地址
    cout << pb2 << endl;//不能转化,指向空。
    //cout << (0 != pb1) << endl;//1
    //cout << boolalpha << (0 != pb1) << endl; //true
    //cout << (0 != pb2) << endl;//0
    //cout << boolalpha << (0 != pb2) << endl; //false
    
    try {
        Derive2& rb1 = dynamic_cast<Derive2&>(b2);//引用转换得了,就转换,转化不了。就异常,所以这里用try catch我猜。把这一部分自己试验一下。
        cout << "true" << endl;
    }
    catch (bad_cast) {//std 里面的转型失败 应该是表示具体的某一个异常吧,比如它会比较像指针下标越界异常这样一种具体的类型,区别于下面的...那个应该是相当于Exception相当于总的最高级的那个。
        cout << "false" << endl;
    }
    try{ Derive22& rb2 = dynamic_cast<Derive22&>(b2);  cout << "true" << endl; }
    catch (...) // 应该是 bad_cast,但不知道为什么在VC++6.0中却不行?因为VC++6.0默认状态是禁用 RTTI 的,启用方式:project->setting->c/c++->category->c++ Language 下面第二个复选框选中。 
    {
        cout << "false" << endl;
    } 


    system("pause");

}

代码2

#include <iostream>
using namespace std;
class Base{
    virtual void function1(void){}
};
class Derive :public Base{
};
class Derive1 :public Base{
};
int main(){
    Derive d1;
    Base* pb = &d1;
    cout << typeid(d1).name() << endl;
    cout << typeid(pb).name() << endl;
    Derive* pb1 = dynamic_cast<Derive*> (&d1);//主要是练习一下这个 dynamic_cast 这个关键字的使用。
    Derive1* pb2 = dynamic_cast<Derive1*> (&d1);
    cout << pb1 << endl;
    cout << pb2 << endl;
    //对于指针能转化 则转化,不能转化指向空。
    //对于引用,能引用则引用,不能引用会报异常。
    Base& b = d1;
    try{
        Derive& aliasd1 = dynamic_cast<Derive&> (b);
        cout << "true" << endl;
    }
    catch (bad_cast){
        cout << "false" << endl;
    }
    try{
        Derive1& aliasd2 = dynamic_cast<Derive1&>  (b);
        cout << "true" << endl;
    }
    catch (bad_cast){//这里用... 或者 bad_cast都是可以的。至于为什么我现在还不知道。
        cout << "false" << endl;
    }
    system("pause");
    return 0;
}

部分代码来自:

http://www.cppblog.com/smagle/archive/2010/05/14/115286.html

http://baike.baidu.com/link?url=hb_GGrSnTI0gVWEFqM7ls0UjyOUQfaosa8lNRCB3f0_yUMWY9X16oh1jrzGXrd3w4_5BD43csVHItm-PJlb_rTsdiY0zlR_adRd_XuQ2V4W

 

typeid关键字

标签:

原文地址:http://www.cnblogs.com/letben/p/5305320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!