1.typeid.

typeid表达式形如:typeid(expr)这里expr是任意表达式或者类型名。如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算(编译器需要/GR支持);否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。

typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)。标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作:

t1 == t2 如果两个对象t1和t2类型相同,则返回true;否则返回false
t1 != t2 如果两个对象t1和t2类型不同,则返回true;否则返回false
t.name() 返回类型的C-style字符串,类型名字用系统相关的方法产生
t1.before(t2) 返回指出t1是否出现在t2之前的bool值

type_info类提供了public虚析构函数,以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符(由此可见,如果把typeid看作函数的话,其应该是type_info的友元)。type_info的name成员函数返回C-style的字符串,用来表示相应的类型名,但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致(往往如此 ),这是由实现所决定的,标准只要求实现为每个类型返回唯一的字符串。

注意:当把typeid作用于指针的解引用*p时,若指针p为0,则:如果p指向的类型是带虚函数的类类型,则typeid(*p)在运行时抛出一个bad_typeid异常;否则,typeid(*p)的结果与p的值是不相关的,在编译时就可以确定。typeid表达式的这点性质与sizeof表达式相似但又有区别,sizeof一定是在编译时进行计算,也就是说,其只考虑表达式的静态类型,与表达式的动态类型无关(即使有虚函数存在)。

2.mutable:

这个是相对与const而言的,如果一个变量被声明为const,一般情况下那么这个变量的内容是不可更改的,但是用mutable修饰后,那么这个变量的const的属性就没有,和普通的变量就没有什么区别了,可以在任何地方被修改。

class Test2
{
public:
   Test2():a(30)
   {
   
   }
void OutPut(int i) const;//这样在output函数里面就不可修改a,和b的值了
private :
   const int a;//声明为const的成员变量,必须要在构造函数中初始化这个变量,并且只能通过初始化列表的方式
   int b;//mutable int b;被mutable修饰后,在output中可以被修改
};
void Test2::OutPut(int i) const
{
   cout<<a<<endl;
   b = 3;//Error因为被const修饰的成员函数是不可以改变类的成员变量的,但是如果在类的成员变量前用mutable修饰,那么这个变量就可以被修改。
}
int main( void ) 

Test2 t;
t.OutPut(3);
}

4.const_cast

const_cast把常量强制转换为非常量,或者把volatile转换成非volatile类型的。eg.

const int a = 10;
//int &b = a;// 这样写是错误的,提示错误的因为a是常量,b是非常了,之间不可以相互转换的
int &b = const_cast<int &>(a);//这样是正确的,因为const_cast<int&>(a)返回的是一个非量的地址了。

5.volatile

volatile英文翻译过来的意思是“易变的,反复无常的”,是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

6.explicit

explicit意思是显式的。只能用在构造函数前面,并且一般是单参数的构造函数,或者有多个参数但仅有一个参数没有默认值.被explicit修饰的构造函数表明是显式的,既然有显式的,那么肯定有隐式的了,先说一说隐式的构造函数。

class Test
{
public:
Test(int i){
}
};

如果我们这样用,Test t(3) ;t = 10;那么在t=10这个语句中,就用到了隐式转换,编译器会这样解释,Test temp(10),t = temp,也就是说其中生成了一个临时变量。这就是隐式转换。如果我们有这样的一个函数 int f(const Test &t),调用的时候f(3),一不小心我们还会以为,f里的参数是int型的呢,为了防止这种隐式转换,就用到了explicit,在构造函数前面加上explicit就可以防止这种隐式转换。

7.__super

Allows you to explicitly state that you are calling a base-class implementation for a function that you are overriding.

__super can only appear within the body of a member function.

__super cannot be used with a using declaration.

c++ 中的生僻关键字相关推荐

  1. C++中的生僻关键字

    1.typeid. typeid表达式形如:typeid(expr)这里expr是任意表达式或者类型名.如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在 ...

  2. C++中的const关键字(zz)

    [补充]mutable关键字 有时我们希望类的数据成员即使在const成员函数中,依然是可以修改的,这时就可以把它们声明为mutable来实现.这样的应用,比如记录各种操作的调用次数,这时,即使在co ...

  3. 了解 C# “.NET研究”4 中的 Dynamic 关键字

    dynamic 关键字和动态语言运行时 (DLR) 是 C# 4 和 Microsoft .NET Framework 4 中的重大新增功能. 这些功能在宣布时就引起了人们的极大兴趣,并伴随着许多疑问 ...

  4. 面试季,Java中的static关键字解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面 ...

  5. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  6. java8中的default关键字

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 把代码写优雅,把架构设计优雅是个值得持续追求的事情.有很多银弹,语法糖和套路可以完美解决代码的扩展性,优雅性.今天简单了解下 ...

  7. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  8. Java中的instanceof关键字

    Java中的instanceof关键字 instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边 ...

  9. 浅谈Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

最新文章

  1. Angular使用@Input和@Output实现父子组件互相传参(类似Vue的props和this.emit)
  2. Linux学习(六)---实用指令(只看这篇就能完成基础的学习)
  3. 三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题
  4. 我是怎么利用微信做兼职月入1W的
  5. 收集几个移动平台浏览器的User-Agent
  6. 图解分布式架构的演进过程!
  7. CodeChef - DGCD——树链剖分+差分
  8. MySQL数据库datetime类型不能为空值的问题
  9. python中debug有什么用途_Python debug 总结
  10. 【Java数据结构与算法】第十五章 B树、B+树和B*树
  11. linux中使用ntpdate命令进行时间更新时出现the NTP socket is in use, exiting
  12. 在Swift中向数组添加元素
  13. java开源商城系统|代码哥如何用java小程序直播商城搭建直播带货平台技术解决方案
  14. PageHelper分页插件的简单使用
  15. Mac 终端使用自动补全时忽略大小写
  16. Jmeter HTTP Proxy Server 代理录制 IE无法录制到请求的问题解决
  17. 【知识点】patch补丁文件格式
  18. 金蝶KIS专业版“登录时出现问题,请重新输入”终极解决全过程
  19. 低配电脑不能运行大型游戏?试试AWS EC2
  20. 编程与手绘的对比——静态篇

热门文章

  1. mt店铺榜+餐饮分类
  2. 使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制
  3. 上半年净利由盈转亏,依赖游戏产品的汇量科技能否持续破局?
  4. dboxShare企业网盘系统开源源码
  5. ERP企业资源系统源码
  6. Linux 下使用 tplink wn823N 无线网卡
  7. 从安格视,安维到安尼
  8. 请出中本聪,迎接新世界(1-5)
  9. 今天那个劝比尔盖茨退学的人死了
  10. 双枢轴快速排序与 Arrays.sort()