zoukankan      html  css  js  c++  java
  • typeid关键字

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

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

    所以决定由视频驱动转向代码驱动。主攻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

  • 相关阅读:
    【GIT-精讲】从零玩转Git-基础理论
    【fmjava】 面试题突击训练-Java基础语法篇01
    【笔记】springSecurity-OAuth2.0-授权模式演示
    【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题
    Python编程题汇总(持续更新中……)
    Python编程题14--随机分配礼物
    Python编程题13--判断两个升序列表,其中一个是另外一个的子集
    Python编程题12--列表中比前面元素都大,比后面元素都小的数
    Python编程题11--找出100以内的质数
    Python编程题10--找出和为N的两个数
  • 原文地址:https://www.cnblogs.com/letben/p/5305320.html
Copyright © 2011-2022 走看看