1.寄存器变量   寄存器变量用于建议编译器将变量放置在CPU寄存器中,用于加宽访问速度。

register int nSum = 100;   //定义寄存器变量

对于寄存器变量,程序中不能获得变量的地址,也不能成为全局变量或静态变量。但可以作为函数的形参。

寄存器变量不能保证将变量放置在寄存器中,也不能保证提高访问速度,它只是对编译器的保证。如今的编译器都具有优化功能,它会自动调整变量的放置,因此,程序中建议避免使用寄存器变量。

 

2.静态变量

介绍静态变量之前先介绍全局变量和局部变量

全局变量指在函数题外定义,生命周期随着程序的结束而结束。      局部变量在函数体内定义,生命周期随着函数的结束而结束。

静态变量主要针对局部变量,如果定义一个静态的局部变量,它的生命周期在函数调用结束后会依然存在,在下次调用时,会依然保存上一次函数调用的值。并且,静态变量只会执行一次初始化(无论函数调用多少次)。

static int s_nSum = 100;   //定义静态变量

普通全局变量不进能够在当前文件中被使用,而且在其他文件中也可以使用。但是全局静态变量则不同,它的作用域是当前定义全局静态变量处到文件结束,不能够在其他文件中访问全局静态变量。

 

 

3.外部变量

外部变量用于告诉编译器在其他文件的全局区域存在一个全局变量,目的是在当前的文件中能够访问这个全局变量。外部变量的声明是使用extern关键字。

extern int g_nvar;

在应用程序中,如果在一个文件中定义了一个全局变量,例如g_nSum,为了在其他文件中能够访问全局变量g_nSum,那么在其他文件中需要声明一个与g_nSum同名的变量。

extern int g_nSum; 这样在其他文件中即可以访问全局变量g_nSum;

 

4.自动变量

自动变量是指变量的生命周期在变量的声明时开始,在离开变量的作用域时结束,它仅限于在函数内使用。

自动变量用auto关键字声明。由于局部变量默认情况下就是自动变量,因此乜有必要使用auto声明自动变量。从自动变量的描述中可以发现,定义一个全局的自动变量是非法的,因为自动变量只能在函数内使用,它只能是局部变量。

 

注意:在定义变量时不能够同时使用register,extern,static,auto四个关键四中的任意两个。

 

5.常量指针和指针常量

常量指针->指向常量的指针

int nVar = 10;

const int * pVar = &nVar; 或 int const * pVar = &nVar;   //定义一个整型常量的指针,并进行初始化

对于指针pVar,用户不能修改pVar指向的值,但是可以修pVar指向的地址.例如

int nVar = 10;

const int * pVar = &nVar;

*pVar = 20;  //这个事错误的

int nNum = 5;

pVar = &nNum;  //对

 

指针常量->指针是常量的指针

int nVar = 10;

int * const pVar = &nVar;   //定义一个指针整型的常量指针

&pVar = 20;  //对的

int nNum = 5;

pVar = &nNum; //错误

使用不能修改pVar指向的地址,但是可以休息pVar指向的数据。

 

指向常量的指针常量

int nVar = 10;

const int * const pVar = &nVar;

用户即不能修改指针指向的地址,也不能修改指向的数据。

 

6.引用类型

引用是一个已经存在对象的别名,引用在定义时一定要初始化。

int nKinds = 10;

int &nRefKinds = nKinds;   //定义一个引用,并且初始化

引用一但确定,无法再改变。nKinds与nRefKinds变量一改全改。

 

7.类型别名

定义一个类型的别名

typedef unsigned char UCHAR

UCHAR  P;  //UCHAR 就代表了 unsigned char

 

8.强制类型转换

静态转换(static_cast)

double dbRate = static_cast<double>(10)/3;

 在编写代码时,如果程序不需要在C语言的环境下运行,建议使用C++形式的强制类型转换。因为C++形式的强制类型转换有一些安全性的限制。

例如,使用C语言的强制类型转换能够将整形指针转换为结构体类型指针,而static_cast则不允许进行这样的转换。

int * nLen;

Student * girl = (Student*)nLen;  //能够进行转换

Student * boy = static_cast<Student*>(nLen);   //错误的语句,不能进行类型转换。

 

动态类型转换(dynamic_cast)

与静态转换不同的是在转换之前它能够进行类型检查。动态转换通常用于一个类对象指针转换为另一个类对象的指针,如果源指针与目标指针类型不兼容,则转换结果为NULL。

动态转换只能对void*(无类型指针)类型或者类对象指针进行转换,并且类中必须包含虚方法,而不能对普通的数据类型进行转换。

 

常量转换(const_cast)

用于将const对象转换为非const对象。

const int MAX_LEN = 100;  //定义整型常量

int *pLen = &MAX_LEN; //定义一个指针,试图使用整型常量的地址进行初始化,导致编译错误。&MAX_LEN是常量指针的地址

int *pLen = (int*)&MAX_LEN; //将常量整型指针转换为整型指针,语句能够编译,但是不提倡。

int *pLen = const_cast<int *>(&MAX_LEN);   //常量转换  

相对应C语言强制类型转换,const_cast是有限的,这也使得const_cast更安全一些。例如

使用C语言的强制类型转换能够将一个int类型的常量指针转换为long类型的指针,而const_cast则不允许。

 

根据常量定义,常量在运行时其值是不能改变的,但是如果通过常量转换,将常量对象转换为非常量对象,利用非常量对象能够间接修改常量的值呢?

const int MAX_LEN = 100;

int *pLen = const_cast<int*>(&MAX_LEN);

*pLen = 200;

int nValue = MAX_LEN;

cout << "nValue:" << nValue << endl;  

调试结果为 MAX_LEN = 200; 而nValue输出为100 ;

这是因为编译器在编译时遇到常量,将其值直接翻译为一个常数,而不进行寻址操作了。所以nValue的值仍未100,没有跟随MAX_LEN值为200;

 

9.重解释转换(reinterpret_cast)

重解释转换能够将任何指针类型转换为其他的指针类型,这种转换方式是一种不安全的转换方式。在应用程序中少用。在C++中使用reinterpret_cast关键字实现重解释转换

char * pszText = "mst";

unsigned int * pAddr = reinterpret_cast<unsigned int *>(pszText);

char * pszCaption = reinterpret_cast<char*>(pAddr);

 

10.命名空间

在开发应用程序时,经常出现多个文件中对象同名的情况,这样会导致应用程序的链接错误,这种错误通常称之为命名冲突。为了解决命名冲突,C++提供了命名空间。

定义格式为

namespace 名称

{

  常量,变量,函数等对象的定义

}

如果使用命名空间中的对象,需要在对象前使用命名空间名作为前缀。

例如程序要输入一个整型。

先包含头文件#include <iostream>

int i;

可以直接 std::cin >> i;

或者

using namespace std;

cin >> i;

 

对于多个文件中出现的同一个命名空间,该命名空间为多个文件中该命名空间内容的总和,但是多个文件中的命名空间不能存在相同的变量或函数声明。

定义未命名的命名空间

namespace   //没有名称

{

}

对于未命名的命名空间来说,其最大的特点就是其命名空间中的对象只能存在于当期文件,各个文件之间并不能互相访问各自的未命名空间中的对象。这一特点使得未命名空间中的对象与全局静态变量作用相同。

在定义未命名的命名对象时,注意其中的对象不能与全局对象同名或相同(函数可以重名,表示重载,但是参数列表不能完全相同)。

 

posted on 2014-07-29 14:14  言止予思  阅读(294)  评论(0)    收藏  举报