typeid关键字
这么看下去太要命了,有太多东西要学了。。。
而且视频看起来的确费神,费脑,费耳朵。
所以决定由视频驱动转向代码驱动。主攻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 = ;
int *pi = &i;
cout << typeid(i).name() << endl;
cout << typeid(pi).name() << endl; decltype(i) num();
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 ;
}
部分代码来自:
http://www.cppblog.com/smagle/archive/2010/05/14/115286.html
typeid关键字的更多相关文章
- [C++] typeid关键字使用方法
typeid 关键字的作用就是获取一个表达式是类型,返回表达式的类型 表达式可以是类型名称.变量名.数字.字符串.指针.结构体等 #include <iostream> using nam ...
- C++ 关键字浅谈
这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...
- c++ type_info and typeid
c++ type_info and typeid typeid 关键字typeid提供了对一个对象查询类型的功能. 该关键字和dynami_cast一起提供了c++的RTTI(rumtime type ...
- 第66课 C++中的类型识别
1. 类型识别 (1)在面向对象中可能出现下面的情况 ①基类指针指向子类对象 ②基类引用成为子类对象的别名 ▲静态类型——变量(对象)自身的类型(定义变量类型时类型或参数类型) ▲动态类型——指针(引 ...
- MFC原理第三讲.RTTI运行时类型识别
MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...
- C++基础知识:动态类型识别
1.动态类型指的是基类指针所指向的对象的实际类型 2.C++中的多态根据实际的对象类型调用对应的虚函数(1)可以在基类中定义虚函数返回具体的类型信息(2)所有的派生类都必须实现类型相关的虚函数(3)每 ...
- C++运行时动态类型
RTTI 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast typeid操作符的实现 静态类 ...
- C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...
- 【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换 ...
随机推荐
- 使用appium做安卓手机web自动化测试 真机demo
一:appium相关环境搭建过程略. 二:连接真机: 1.手机(andriod 4.2.2)连接电脑,打开USB调试模式. 2.运行cmd 输入 adb devices -l 查看UDID,如图: 3 ...
- GIS中相交的定义(OGC相交的定义)
我们常用GIS中的相交,比如在地图漫游的时候,屏幕显示的图形和屏幕这个包络线就是相交的关系.我们常用的GIS工具,拉框查询,这个用到的也是相交. 首先题目开起来很简单(开始的时候我是这样想的),但是做 ...
- 劳动节BT5 aircrack-ng战记
劳动节最后一天没事,想捣鼓一下BT5破解无线wep/wpa,BT5+virtual box早已准备就绪,上网专门找了一些资料,并买了一个据评测很兼容的usb网卡tp-link wn722n,芯片代号A ...
- Swift之基础知识
Swift之基础知识 出于对Swift3.0的学习,写下这篇基本语法的笔记.希望能帮助记忆 -0- 这边提供Swift3.0中文教材,资源链接: https://pan.baidu.com/s/1c2 ...
- MyEclipse10 Tomcat7 JDK1.7 配置
第一步.MyEclipse10 Tomcat7 JDK1.7下载 MyEclipse10http://downloads.myeclipseide.com/downloads/products/ewo ...
- 说说QQ空间SEO
其实这个话题由来已久,已经有很多大神做到QQ空间日访问量破万,甚至更多了,卖产品卖到抽筋儿. 怎么说QQ空间SEO,其实不如说QQ空间引流更合适,因为QQ空间与QQ的特殊关系,SEO貌似不是很重要,其 ...
- [OC Foundation框架 - 21] NSSet集合 & 集合之间的转换
A.NSSet 跟NSArray一样,不可变 NSArray 自然顺序 NSSet是无序的 NSSet不允许存入重复元素,可以用来过滤重复元素 也有可变的NSMutableSet B.集合转换 ...
- 1098. Insertion or Heap Sort (25)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- MSSQLSERVER数据库- SQL删除重复数据的五种方式
删除重复的数据,在平时的工作中还是会和碰到的,感觉挺有用,从网上摘录的,记在这里,以备需要时查阅 --方法一,IN方式,适合2000/2005/2008,6728 毫秒 DELETE [student ...
- 【C++深入浅出】智能指针之auto_ptr学习
起: C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template& ...