最近正在准备毕业答辩,基本材料已经准备停当,现在有些闲暇时间。突然从自己书堆中翻出了一本讲解C/C++语言的书,
想来闲着也没有什么事,不如温习以下以前学过的知识。所以,这里就简单写一点自己对C/C++中琐碎知识点的理解,有什么
不准确的地方还望读者指正,大家一起探讨!
C++中引入了引用(reference)的概念,引用并不是C++的新发明,它也存在于其它的变成语言之中。
从功能上来说,C++中引用的作用和C中的指针在本质上是相同的,都表示“地址”。例如,我们有这样一个C代码函数:
void fun(int *n){//some condes}
在这个函数中,我们给函数fun传递一个int类型的指针,也就是一个int类型数据的空间地址。如果用C++语言,这个函数可以
写成如下形式:
void fun(int& n ) { //some codes }
在这个函数中,我们给函数fun传递一个int类型的引用,其本质上也是一个int类型数据的空间地址。但是,和C代码的书写方
式不同,我们用&代替*同时,他们最主要的区别还是在于调用方式的不同。
C调用方式:
int testNum = 0 ; fun(&testNum);
C++调用方式:
int testNum = 0 ; fun(testNum);
static关键字具有一些特殊的含义,下面我将根据static关键字在文件中所处的位置分别说明其作用。
第一:static处在函数体中
我们都知道,函数中定义的局部变量在函数作用域结束时就消失,当再次调用这个函数的时候,
会重新创建这个变量的存储空间,其值也会被重新初始化。但是,由于程序需要,我们常常有时候希望
函数中局部变量的值在程序的整个生命周期内存在(注意,这里是程序的整个生命周期,不是函数的生命周期),
这时我们就可以把函数的局部变量定义成为static类型,并给它一个初始化值。下面是一个简单的列子:
void fun()
{
static int i =0;
cout<<"i = "<< ++i << endl;
}
在这个函数中,i被定义为static类型,同时对其进行了初始化。其中,只有程序第一次调用该函数的时候
i才被初始化,再次调用的时候不再进行初始化操作,而是在原来的基础上继续进行操作,在fun中就是执行加一的操作。
有人可能会问为什么不用全局变量呢?static变量的另外一个特点是,在函数范围之外它是不可用的,所以它不能被轻
易修改。
第二:static在所有函数之外
当static位于函数名之前或者位于所以函数之外的变量名之前的时候,它的意识是“在文件的外部不可以使用这个名字”
也就是说,这个名字是局部于文件的;我们说它具有文件作用域(file scope)。
//file1.cpp
static int i ;
int main()
{
i = 1;
return 0;
}
在这个文件中,i只能在本文件中被访问,在其他文件中不能使用。如有下面的文件:
//file2.cpp
extern int i;
void func()
{
i =10;
}
尽管生命i是extern,但是连接器不会找到它,因此会出现错误。
当static位于类中成员变量/成员函数之前的时候,表示该变量/函数是“类所有”,而不是类的对象所有。
也就是说,该变量/函数是通过类名访问的,类的对象也可以访问。但是在每一个对象中并没有这样的变量/函数,而是所有
的对象共用“一套”这样的变量/函数.
另外,类的static类型的函数只能使用static类型的变量,不能使用其他的成员变量,应为这些变量时属于具体的
对象实例而不是属于整个类。
有关static在类中的作用,已经有很多详细解释,这里不再班门弄斧,如果有什么需要探讨的地方,可以留言给我,我会及时回复!
3.extern的作用
extern 关键字告诉编译器存在着一个变量/函数,虽然现在还没有看到它,但是可以放心使用,保证这个变量/函数已经定义。
首先,我们先看一下下面几行代码:
int i ;
void fun(){}
/*******************/
extern int i ;
extern void fun();
前两行代码表示的是变量和函数的定义,而后两行则是变量和行数的声明。
我们需要弄明白声明和定义的区别:
声明仅仅是告诉编译器有这样一个变量/函数,而不是向编译器要求分配空间。
定义是对变量/函数的定义,需要通过编译器向系统索要内存空间,分配内存地址。
在C++中函数声明前面的extern是可有可无的,因此,一般情况下,这个关键字是不写的。
而如果我们要在定义变量之前使用该变量或者是要使用在别的文件中定义的变量我们就需要在
使用之前对其进行声明,也就是告诉编译器这个变量已经在别处定义,可以放心使用。
//file1.cpp
extern int i ;
extern voidfun();
int main ()
{
i = 1;
fun();
}
//file2.cpp
int i ;
void func()
{
i++;
cout<
如上面的代码,变量i和函数fun的定义在file2.cpp中,而在file1.cpp中使用到了它们,所以在使用之前需要对其进行声明,
也就是再前面加上extern,对于fun并不是必要的。
今天先写这些了!