标签:
这么看下去太要命了,有太多东西要学了。。。
而且视频看起来的确费神,费脑,费耳朵。
所以决定由视频驱动转向代码驱动。主攻vs,c++然后先把界面东西做出来,然后在想后面的东西。
所以今天
【先上来看了一个关键字, typeid,返回的是动态加载之后的变量或者对象的类型。
我记得跟之前我看到的一个java里面的number类里面的有一部分的描述很像。关于这个number到底是 int或是 double 或者 long 说是 short 说 float。嗯 我记得就5个子类】
然后附上typeid的相关资料。
//百科上有谬误。
示例代码:
#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。
pdb是double *类型的,所以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://www.cnblogs.com/letben/p/5305320.html