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

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

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

所以今天

【先上来看了一个关键字, 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

//百科上有谬误。

示例代码:

  1. #include <iostream>
  2. void main()
  3. {
  4. double db = 10.9;
  5. double *pdb = &db;
  6. auto num = pdb;//通用传入接口
  7. std::cout << typeid(db).name() << std::endl;
  8. std::cout << typeid(num).name() << std::endl;
  9. std::cout << typeid(pdb).name() << std::endl;
  10. //typeid(db).name() db2;
  11. decltype(db) numA(10.9);//通用的备份接口
  12. std::cout << sizeof(numA) <<" "<< numA << std::endl;
  13. system("pause");
  14. }

运行结果:

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:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void main(){
  5.  
  6. //Part A.
  7. int i = ;
  8. int *pi = &i;
  9. cout << typeid(i).name() << endl;
  10. cout << typeid(pi).name() << endl;
  11.  
  12. decltype(i) num();
  13. cout << num <<" "<< typeid(num).name() << endl;
  14.  
  15. cout << "Part B." << endl;
  16. class Base1 {};
  17. class Derive1 :public Base1 {};
  18. Derive1 d1;
  19. Base1& b1 = d1;
  20. cout << typeid(b1).name() << endl;//?AVBase1@?1?main@
  21. cout << typeid(d1).name() << endl;//?AVDerive1@?1?main@
  22.  
  23. cout << "Part C." << endl;
  24. class Base2 {
  25. virtual void fun(void) {}
  26. };
  27. class Derive2 :public Base2 { };
  28. Derive2 d2;
  29. Base2& b2 = d2;
  30. cout << typeid(b2).name() << endl;
  31.  
  32. cout << "Part D." << endl;
  33. class Derive22 :public Base2 { }; //Base2 里面有一个虚函数。
  34. Derive2* pb1 = dynamic_cast<Derive2*>(&b2);//Derive2 共有的继承了Base2.
  35. Derive22* pb2 = dynamic_cast<Derive22*>(&b2);
  36. cout << pb1 << endl;//可以转化指向一个具体地址
  37. cout << pb2 << endl;//不能转化,指向空。
  38. //cout << (0 != pb1) << endl;//1
  39. //cout << boolalpha << (0 != pb1) << endl; //true
  40. //cout << (0 != pb2) << endl;//0
  41. //cout << boolalpha << (0 != pb2) << endl; //false
  42.  
  43. try {
  44. Derive2& rb1 = dynamic_cast<Derive2&>(b2);//引用转换得了,就转换,转化不了。就异常,所以这里用try catch我猜。把这一部分自己试验一下。
  45. cout << "true" << endl;
  46. }
  47. catch (bad_cast) {//std 里面的转型失败 应该是表示具体的某一个异常吧,比如它会比较像指针下标越界异常这样一种具体的类型,区别于下面的...那个应该是相当于Exception相当于总的最高级的那个。
  48. cout << "false" << endl;
  49. }
  50. try{ Derive22& rb2 = dynamic_cast<Derive22&>(b2); cout << "true" << endl; }
  51. catch (...) // 应该是 bad_cast,但不知道为什么在VC++6.0中却不行?因为VC++6.0默认状态是禁用 RTTI 的,启用方式:project->setting->c/c++->category->c++ Language 下面第二个复选框选中。
  52. {
  53. cout << "false" << endl;
  54. }
  55.  
  56. system("pause");
  57.  
  58. }

代码2:

  1. #include <iostream>
  2. using namespace std;
  3. class Base{
  4. virtual void function1(void){}
  5. };
  6. class Derive :public Base{
  7. };
  8. class Derive1 :public Base{
  9. };
  10. int main(){
  11. Derive d1;
  12. Base* pb = &d1;
  13. cout << typeid(d1).name() << endl;
  14. cout << typeid(pb).name() << endl;
  15. Derive* pb1 = dynamic_cast<Derive*> (&d1);//主要是练习一下这个 dynamic_cast 这个关键字的使用。
  16. Derive1* pb2 = dynamic_cast<Derive1*> (&d1);
  17. cout << pb1 << endl;
  18. cout << pb2 << endl;
  19. //对于指针能转化 则转化,不能转化指向空。
  20. //对于引用,能引用则引用,不能引用会报异常。
  21. Base& b = d1;
  22. try{
  23. Derive& aliasd1 = dynamic_cast<Derive&> (b);
  24. cout << "true" << endl;
  25. }
  26. catch (bad_cast){
  27. cout << "false" << endl;
  28. }
  29. try{
  30. Derive1& aliasd2 = dynamic_cast<Derive1&> (b);
  31. cout << "true" << endl;
  32. }
  33. catch (bad_cast){//这里用... 或者 bad_cast都是可以的。至于为什么我现在还不知道。
  34. cout << "false" << endl;
  35. }
  36. system("pause");
  37. return ;
  38. }

部分代码来自:

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关键字的更多相关文章

  1. [C++] typeid关键字使用方法

    typeid 关键字的作用就是获取一个表达式是类型,返回表达式的类型 表达式可以是类型名称.变量名.数字.字符串.指针.结构体等 #include <iostream> using nam ...

  2. C++ 关键字浅谈

    这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...

  3. c++ type_info and typeid

    c++ type_info and typeid typeid 关键字typeid提供了对一个对象查询类型的功能. 该关键字和dynami_cast一起提供了c++的RTTI(rumtime type ...

  4. 第66课 C++中的类型识别

    1. 类型识别 (1)在面向对象中可能出现下面的情况 ①基类指针指向子类对象 ②基类引用成为子类对象的别名 ▲静态类型——变量(对象)自身的类型(定义变量类型时类型或参数类型) ▲动态类型——指针(引 ...

  5. MFC原理第三讲.RTTI运行时类型识别

    MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

  6. C++基础知识:动态类型识别

    1.动态类型指的是基类指针所指向的对象的实际类型 2.C++中的多态根据实际的对象类型调用对应的虚函数(1)可以在基类中定义虚函数返回具体的类型信息(2)所有的派生类都必须实现类型相关的虚函数(3)每 ...

  7. C++运行时动态类型

    RTTI 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast typeid操作符的实现 静态类 ...

  8. C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...

  9. 【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换 ...

随机推荐

  1. windows和linux间互传文件

    方法1:Xshell传输文件 用rz,sz命令在xshell传输文件 很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安 ...

  2. Selenium webdriver 之select 控件封装,解决onchange问题

    使用webdriver的时候,select 控件经常会绑定onchange 事件,在selenium2.09 之前click 方法对onchange 事件有bug,2.09 以后修复了,但是根据经验也 ...

  3. 在MFC框架中使用OpenGL的简单实例

    引言 我们知道,在MFC框架中,用于绘图的接口是GDI.但GDI只能绘制简单的2D图形,要想制作精美的3D图形,一个可行的办法是使用OpenGL或者Direct3D等第三方库. 由于最近在给导师的一个 ...

  4. 京东拍拍网 笔试 搞java的去考C++ 苦逼

    1.用C实现数字逆转,用递归实现,很简单. package 京东; public class Main { private static int a=0; public static void fun ...

  5. Leetcode OJ : Merge k Sorted Lists 归并排序+最小堆 mergesort heap C++ solution

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  6. 五个小例子教你搞懂 JavaScript 作用域问题

    众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者 ...

  7. 解决outlook无法启动

    当outlook出现上述问题时,修复的方案: 1.在打开的命令提示符窗口中,输入"cd C:\Program Files\Microsoft Office\Office12"然后回 ...

  8. CentOS 6.5 安装配置

    关于CentOS的安装,网上有很多详细的教程.其实重点就在于硬盘的分区和软件的定制这两块.下面我在VirtualBox虚拟机上安装 CentOS-6.5-i386-minimal. 1.在起始菜单处选 ...

  9. hdoj 1162 Eddy's picture

    并查集+最小生成树 Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  10. windows 一个进程可以允许最大的线程数

    默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也 ...