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 //没有名称
{
}
对于未命名的命名空间来说,其最大的特点就是其命名空间中的对象只能存在于当期文件,各个文件之间并不能互相访问各自的未命名空间中的对象。这一特点使得未命名空间中的对象与全局静态变量作用相同。
在定义未命名的命名对象时,注意其中的对象不能与全局对象同名或相同(函数可以重名,表示重载,但是参数列表不能完全相同)。
浙公网安备 33010602011771号