设为首页 加入收藏

TOP

【C++研发面试笔记】1. C++常见关键字含义(三)
2016-10-08 11:31:16 】 浏览:719
Tags:研发 面试 笔记 常见 关键字 含义
的重载。 当extern不与”C”在一起修饰变量或函数时,如在头文件中: extern int g_Int;它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块引用其他模块中的定义,记住它是一个声明不是定义,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。

1、extern 和 static
(1)extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量。
(2)static 表示静态的变量,分配内存的时候,存储在静态区,不存储在栈上面。
static 作用范围是内部连接的关系, 和extern有点相反。static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量。

2、extern 和const
C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中, 如extern const char g_str[];


1.10 template

声明一个模板、模版的特化或显式实例化。模版用于打破类型系统的某些限制,推迟类型检查到实例化得到具体的模版实例进行以复用代码,实现泛型和参数化编程


1.11 this

this是一种实体,仅在类的非静态成员中使用,是指向类的对象的指针右值。


1.12 typedef

用以给数据类型取别名。字面名义上是定义,实际是声明,这点和C语言的说法不同。


1.13 typeid

获取表达式的类型,以std::type_info表示结果,可能抛出std::bad_typeid。当操作数非多态类(引用)类型在编译时即可确定结果,否则需要在运行时取得结果,即RTTI。

从名字直观看来,该关键字应该是获取语言元素的类型ID。其实它和sizeof类似,是一个类型运算符。有时候代码可能需要获取某个变量或者类型的名字,这时候使用typeid就比较合适。

使用格式:typeid(int)或typeid(i+1)
这样操作后返回有个type_info类型的对象,比较常用的对象成员函数一般有比较是否相等和获取类型名。


1.14 typename

告诉编译器一个嵌套的限定名(包含::)中的未知的标识符是一个类型。这只在模板中需要区分依赖名称时使用。另一种用法是在模版声明参数列表中表示模版类型参数,可被class代替。

1、第一种情况是在函数模板和类模板声明中
一般模板声明中,使用class关键字指定类型参数,后来C++支持使用typename代替class关键字。这里仅仅是在语义上强调模板使用的类型参数不一定是类类型,可以是所有类型。这里typename和class没有任何区别。使用格式:
template template 完全等价!

2、第二种情况使用情况比较特殊
简单说起来就是在使用类内成员类型的时候。类内成员类型就是在类定义内声明了一个类型,该类型属于类型内部,可见性由权限访问符限定。使用格式:
typename T::MyType * pvar;和typedef typename T:: MyType MyType;


1.15 asm

用于语法:
asm-definition: asm ( string-literal );
意义由实现定义,典型实现中传输其中的字符串给汇编器。


1.16 auto

在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,若是对象同时具有自动存储类,即生存期在块结束时结束。这样的变量被称为局部变量。这个关键字不常用,因为即便省略,声明的默认就是auto的。

在C++11中,auto的含义改变为自动通过初值符推断声明的类型占位符。如声明auto i = 1;,auto就相当于int,因为1是int类型,可以推断出i的类型。也可以使用auto& i等声明,具体推导规则同模版参数类型推导。


1.17 *_cast

显式类型转换,C++延续了C风格的强制类型转换的语法。dynamic_cast是动态的,需要运行时支持;其它都是静态检查,相比C风格的类型转换更加细化,增强了类型安全性。C++支持四种关键字对不同形式的类型转换进行分别处理。使用格式:
转换关键字<类型>(表达式)

1、static_cast和C风格类型转换功能完全相同,它属于在编译时期静态的类型转换。如果把一个double类型转换为整形,形式如下:
static_cast (0.1);
static_cast功能有所限制,比如不能转化struct类型到int,不能转化指针到double等。另外,它不能在转换中消除const和volatile属性。

2、const_cast用于消除引用或者指针的const或者volatile属性。
const int &ci=100;
int &i=const_cast (ci);
通过这种方式,ci引用的内存单元虽然无法通过修改ci改变,但是可以修改i改变内存的值。这里是把const属性消除,这里想多说一点的是把const加上的问题。

3、dynamic_cast一般出现在类到子类或兄弟类的转换,并要求基类有虚函数。而且它能提供转换后的结果和状态,一旦转换失败则返回空指针。如果没有继承关系的转换一般使用static_cast。

4、reinterpret_casts一般用作函数指针的转换,而且使用它的代码可移植性很差,因为无法确定编译器的函数调用方式等。有可能会导致函数调用出错,一般不常用。


1.18 explicit

explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的,而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。

explicit关键字只对有一个参数的类构造函数有效,如果类构造函数参数大于或等于两个时,是不会产生隐式转换的,所以explicit关键字也就无效了,而除了第一个参数以外的其他参数都有默认值的时候,explicit关键字依然有效。

除非有心利用,隐式转换常常带来程序逻辑的错误,而且这种错误一旦发生是很难察觉的。原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。

隐式转换的含义:在C++中,如果的构造函数只有一个参数时,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。也就是说CxString string2 = 10;这段代码,编译器自动将整型转换为CxString类对象,实际上等同于CxString string2(10);


1.19 export

导出模版,用于分离编译。C++11废除了这个export关键字的含义,但保留这个关键字。


1.20 register

提示声明的对象被放入寄存器中以便得到更好的性能。同inline类似,并非强制;不同的是这个提示经常被现代的编译器无视,因此C++11中被标记为过时的。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【C++研发面试笔记】12. 基本数据.. 下一篇利用c++实现数值坐标刻度生成,并..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目