C和CPP有些关键字看起来简单实在若深究其中大有文章,今天我就来整理几个较为常用也很重要的CPP关键字:static、const 、extern、inline、typename、explicit、new、delete. 先就说这几个吧,能把这几个关键字的内容整理完也是有不少的篇幅了.以后有需要再添加便是.
关键字之一:static
1、在C语言中的用法
(01)、修饰全局变量
①、该变量被定义成为一个静态全局变量 VS 未加static的全局变量默认是动态的
②、未经初始化的静态全局变量会被程序自动初始化为0.
③、静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的也就不能被其它文件所用,其它的文件即使用extern声明也不能使用 VS 未加static的全局变量在文件中是共享的.在另一个文件中通过extern全局变量名的声明就可以使用该全局变量
④、静态变量都在全局数据区分配内存
(02)、修饰函数中的变量
①、该变量就被定义成为一个静态局部变量
②、一般在声明处初始化,如果没有显式初始化会被程序自动初始化为0
③、在全局数据区分配内存.不会随着函数的退出而释放空间.每次的值保持到下一次调用直到下次赋新值
(03)、修饰函数
①、该函数被定义成为一个静态函数
②、该函数只能在声明它的文件当中可见,不能被其它文件使用
③、定义静态函数的好处是其它文件中可以定义相同名字的函数不会发生冲突
2、在CPP语言中的用法
(01)、修饰类中的数据成员
①、该数据成员就被定义成为一个静态数据成员
②、该数据成员只分配一次内存且被该类的所有对象所共有
③、静态数据成员存储在全局数据区.静态数据成员定义时要分配空间,所以不能在类声明中定义.必须进行初始化
④、静态数据成员和普通数据成员一样遵从public,protected,private访问规则
⑤、静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>.访问时既可以用类对象也可以用类类型名进行访问
(02)、修饰类中的成员函数
①、静态成员函数由于不是与任何的对象相联系,因此它不具有this指针
②、无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员
③、非静态成员函数可以任意地访问静态成员函数和静态数据成员
④、由于静态成员函数没有this指针使得我们得以将C++和C-BasedXWindow系统结合,同时也成功的应用于线程函数身上
关键字之二:const
简单说明:常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.当然,我们可以偷梁换柱进行更新.const推出的初始目的正是为了取代预编译指令消除它的缺点同时继承它的优点.使用const在一定程度上可以提高程序的安全性和可靠性
1、在C语言中的用法
(01)、修饰常量使其具有不可变性.例如:constintMax=100;intArray[Max].const修饰一个变量使其成为只读的.常量必须被初始化
(02)、便于进行类型检查使编译器对处理内容有更多了解消除了一些隐患.例如:voidf(constinti){...}编译器就会知道i是一个常量不允许被修改
(03)、const定义常量从汇编的角度来看只是给出了对应的内存地址 VS #define给出的是立即数
(04)、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高.
(05)、应用说明:typedef char * pStr;①、const char *p1 = string; ②、const pStr p2 = string; const使用的基本形式:const type m;
①、替换基本形式中的m为①式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的,因此p1++允许的("*"不是一种类型)
②、替换基本形式中的type为②式中的pStr,替换后constpStr ;限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的
(06)、const int nValue == int const nValue; const char *pContent == char const * pContent.const在*的左边,则指针指向的变量的值不可变;在*的右边,则指针的指向不可变.简记为“左定值,右定向”
(07)、const修饰的变量只会在第一次调用的时候分配内存,以后调用不再进行内存分配
(08)、补充:①、在c中对于const定义的指针不赋初值编译不报错即int*const px等不会报错
②、在C++中int* const px和const int *const px会报错,const int *px不报错.必须初始化指针的指向int* const px=&x;const int* const px=&x;强烈建议在初始化时说明指针的指向以防止出现野指针
(08)、const指针可以接受const和非const地址,但是非const指针只能接受非const地址
2、在CPP语言中的用法
(01)、修饰类的成员函数如void OneClass::function() const;使改函数成为类的常成员函数,常成员函数是不能改变成员变量值的函数.非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员But但构造函数和析构函数对这个规则例外
(02)、修饰常引用.该引用所引用的对象不能被更新.其定义格式如const double & v;
(03)、修饰类的对象使其成员常量对象.常量对象只能调用哪些被const修饰的成员函数
(04)、类中一个同时被const和static修饰的整形变量可以在声明的时候初始化如class A{static const int n = 10;};当然也可以在类的外部初始化 int A::n = 10
(05)、static和const不能同时修饰一个成员函数.因为static没有this指针,但const修饰有this指针
(06)、无需将函数void f(int x)写成void f(const int x).因为函数将自动产生临时变量用于复制该参数,该输入参数无需保护.对于修饰函数返回值的情况同理
(07)、对于非内部数据类型的输入参数,应该将值传递的方式改为const引用传递目的是提高效率.例如:将void f(A a)改为void f(const A &a).对于修饰函数返回值的情况同理
(08)、对于内部数据类型的输入参数,不要将值传递的方式改为const引用传递.否则既达不到提高效率的目的,又降低了函数的可理解性.因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,值传递和引用传递的效率几乎相当.
更多内容请参考文章《const思考》http://t.cn/al0Jd7
关键字之三:inline
在CPP中行,inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义.对这个关键字做个简单说明如下:
(01)、inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高.
(02)、编译器在调用一个内联函数时,会首先检查它的参数的类型以保证调用正确.然后进行一系列的相关检查,这样就消除了它的隐患和局限性
(03)、inline可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员.
(04)、如果类的成员函数直接在类中定义,则不需要用inline修饰,编译器自动将其化为内联函数
(05)、在调用内联函数时,要保证内联函数的定义让编译器"看"到,也就是说内联函数的定义要在头文件中,
(06)、inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议
关键字之四:typename
(01)、template声明式中,class和typename这两个关键字意义完全相同
(02)、请使用关键字typename标识嵌套从属类型名称如typedef typename AccumulationTraits<T>:: AcctT AccT
(03)、不得在base class list(基类列表)或member initialization list(成员初值列表)内以它作为baseclass修饰符.
更详细解释请看《了解typename的双重意义》http://t.cn/z87dnn0
关键字之五:explicit
(01)、按照CPP规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象.该关键字就是用来阻止这个转换的发生的.
更详细解释请见《C++笔记之explicit构造函数》http://t.cn/SVbnCC
关键字之六:new
一、new是C++的一个关键字,同时也是操作符而不是函数.关于new的话题非常多,因为它确实比较复杂,也非常神秘.它至少可能代表以下三种含义:new operator、operator new、placement new
(01)、当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针.当然,如果我们创建的是简单类型的变量,那么第二步会被省略.
(02)、与malloc的区别在于,当malloc失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话则会
(03)、operator new默认情况下首先调用分配内存的代码,尝试得到一段堆上的空间,如果成功就返回,如果失败则转而去调用一个new_hander,然后继续重复前面过程
(04)、placement new是用来实现定位构造的,因此可以实现newoperator三步操作中的第二步,也就是在取得了一块可以容纳指定类型对象的内存后,在这块内存上(栈或堆)构造一个对象,
更多内容请参考《百度百科之NEW关键字》 http://t.cn/z87k5cA
关键字之七:delete
一、使用此关键字至少要遵循以下原则
(01)、new和delete是成对出现的.只出现一个是错误的或不规范的写法,即使能编译通过,也会有安全隐患
(02)、使用的new与delete要相同.也就是说如果你在new表达式中使用了[],你必须在对应的delete表达式中使用[]
(03)、对一个指针只能使用一次运算符delete