C++作用域 与 四种强制类型转换

C++四种强制类型转换:const_cast,static_cast,dynamic_cast,reinterpret_cast。

const_cast 用来去除数据类型中的const属性。在《C++语言程序设计(第四版)》中有提到:const_cast只用于将常量指针转换为普通指针,将常引用转换为普通引用,而不用来将常对象转换为普通对象,因为这是没有意义的。
用法:const_cast (expression)

static_cast 静态类型转换。它一般来说是安全和确定的。不过比如在void指针使用static_cast时如果使用不当也会有不安全的情况发生,所以一定要将其转换为最初的类型。
  1. 父类和子类之间转换:其中子类(派生类)指针转换成父类(基类)指针(上行转换)是安全的,但父类指针转换成子类指针(下行转换)是不安全的(由于没有动态类型检查)。

  2. 基本数据类型转换。enum, struct, int, char, float等。这种转换的安全性也要开发人员来保证。

Eg: int i=2;

      float x=atatic_cast(i);

  3. 把空指针转换成目标类型的空指针。

  4. 把任何类型的表达式转换成void类型。Eg:  void *p = static_castvoid *>(pn);

  5. static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

用法:static_cast < type-id > ( expression )


dynamic_cast 主要用于类层次间的上行转换和下行转换(并且基类一定要有虚函数),还可以用于类之间的交叉转换。而且它是运行时而不是编译时处理的,而运行时要进行类型检查,所以进行下行转换时,它比static_cast更安全。

用法:dynamic_cast ( expression )
该运算符把expression转换成type-id类型的对象。Type-id 必须是类的 指针 、类的引用或者 void *;(参见百科)


reinterpret_cast  其所做的转换一般只用于帮助实现一些非常底层的操作,有很大的危险性和不确定性。
用法:reinterpret_cast (expression)
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

引用下前辈讲的:
关于作用域,有项目的作用域(多文件),文件作用域,函数作用域,块作用域({}()[]内的作用域)。

全局变量:分为静态和外部形式。默认为静态,作用域为当前文件,当申明为外部时,作用域为整个项目,在其他文件中可以访问该变量。(静态变量只会创建一次,并且生存期是整个程序执行期间,因此上次的值会保存下来,但是动态变量则会被释放,重新分配,值无法保存)

局部变量:局部变量出现在一个作用域内,它们是局限于一个函数的。静态局部变量只对定义自己的函数体始终可见。(C++primer plus中提到,在全局作用域声明的const变量是定义该对象文件的局部变量,除非制定const变更为extern,否则不能被其他文件访问。)

auto:声明变量为自动变量,但通常可以省略。C++11中,auto可以用于自动类型推断。

extern:声明全局变量。extern告诉编译器存在着一个变量和函数,即使编译器在当前的文件中没有看到它。这个变量或函数可能在一个文件或者在当前文件的后面定义。

static:
面向过程:在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
面向对象:在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
(同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。)可以创建一个静态成员函数

const:使被修饰对象变成常量,无法更改。







你可能感兴趣的:(C++)