继续学习C++关键字,这一篇主要是认识include、typedef、template、const、static、virtual
这几个关键字。
1.include关键字
这个关键字作用主要是:引用头文件
但是引用的方式有些细微区别,如#include "AppConfig.h"和#include <AppConfig.h>
<mm>和"mm"是有区别的,在搜索头文件的路径和顺序上。
<>表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录;
“”表示先搜索当前目录,然后系统目录,然后PATH目录。
通常自定义的头文件用“”表示,因为自定义的通常都放在当前工作目录。
注意这里标准C++这么写:#include <AppConfig>
2.typedef
允许使用现有类型创建新类型
如 typedef int INT32
使用 INT32 i1
3.template
Templates能用来创建一个对未知数据类型的操作的函数模板.这个通过用其它数据类型代替一个占位符data-type 来实现。
这个关键字可以使我们创建一些通用的类或者函数。
例1
template<class type> type add(tpye a,tpye b)
{
return a+b;
}
调用
int c=add(1,2);等价于int c=add<int>(1,2);
例2
template<class X> void genericSwap( X &a, X &b )
{
X tmp;
tmp = a;
a = b;
b = tmp;
}
4.const
用来告诉编译器一个一旦被初始化过的变量就不能再修改。
作用
(1)可以定义const常量 例如:
const int Max=100;
int Array[Max];
(2)便于进行类型检查 例如:
void f(const int i) { .........}
编译器就会知道i是一个常量,不允许修改;
(3)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
还是上面的例子,如果在函数体内修改了i,编译器就会报错;
例如:
void f(const int i) { i=10;//error! }
(5) 为函数重载提供了一个参考。
class A
{
......
void f(int i) {......} file://一个函数
void f(int i) const {......} file://上一个函数的重载
......
};
(6) 可以节省空间,避免不必要的内存分配。
例如:
#define PI 3.14159 file://常量宏
const doulbe Pi=3.14159; file://此时并未将Pi放入ROM中
......
double i=Pi; file://此时为Pi分配内存,以后不再分配!
double I=PI; file://编译期间进行宏替换,分配内存
double j=Pi; file://没有内存分配
double J=PI; file://再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
(7) 提高了效率。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
5. static
数据类型用来给变量创建永久存储空间.静态变量在函数间调用时保持他们的值不变.
当用在一个类中时,所有要用到静态变量的时候这个类将把这个变量镜像过去。
主要作用如下:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(在其他模块用需要使用using namespace)
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
6.virtual
用来创建虚函数,它通常不被派生类有限考虑.但是假如函数被作为一个纯的虚函数 (被=0表示)时, 这种情况它一定被派生类有限考虑。
如果父类声明一个虚函数,子类声明同名函数覆盖父类,那么父类对象引用子类时,得到调用时子类方法。
Class A
{
public:
virtual void f()
{
cout<<"A"<<endl;
}
}
Class B:public A
{
public:
void f()
{
cout<<"B"<<endl;
}
}
A a=new B();
a.f()输出时:A