《程序员面试笔试宝典》C/C++关键字-static

第一章:程序设计基础
1.1 C/C++关键字
1.1.1 static(静态)变量的作用
主要参考博客:https://www.cnblogs.com/BeyondAnyTime/archive/2012/06/08/2542315.html
C语言中:
(1)静态局部变量:在函数体内,静态变量具有记忆功能,在这个函数中调用的过程中其值维持不变。

#include <iostream.h>
void fn();
void main()
{
   fn();
   fn();
   fn();
}
void fn()
{
   static n=10;//!!!!!!!!!!!!!
   cout<<n<<endl;
   n++;
}

结果是:10,11,12.原因是static n=10;代码只在第一次fn()被执行,下面的fn()直接跳过这句代码。
(2)静态全局变量:在模块内(但在函数体外),其作用范围有限制,静态变量可以被模块内所有的函数访问,不能被模块外其他函数访问。是一个本地局部变量。静态函数与普通函数作用域不同,作用域仅在本文件中,可以被模块内其他函数调用,不能被模块外其他函数调用。

#include <iostream>
void fn();
static int n; //定义静态全局变量!!!!!!!!!!!!!
using namespace std;
void main()
{
    n = 20;//!!!!!!!!!!!!!
    cout << n << endl;
    fn();
}

void fn()
{
    n++;
    cout << n << endl;
}

结果是:20,21.
而下面的代码运行就会出错

//File1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量!!!!!!!!!!!!!
void main()
{
   n=20;
   cout<<n<<endl;
   fn();
}
//File2
#include <iostream.h>
extern int n;//!!!!!!!!!!!!!
void fn()
{
   n++;//!!!!!!!!!!!!!
   cout<<n<<endl;
}

(3)静态函数:在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

#include <iostream.h>
static void fn();//声明静态函数!!!!!!!!!!!!!
void main()
{
   fn();
}
void fn()//定义静态函数
{
   int n=10;
   cout<<n<<endl;
}

总的来说,static全局变量与普通全局变量的区别是static全局变量只初始化一次,目的是防止在其他文件单元中被引用。Static局部变量和普通局部变量的区别是static局部变量只被初始化一次,下一次的运算依据上一次的结果。Static函数与普通函数的区别在于作用域不一样,static函数在源文件中有效,不能被其他源文件使用。

C++中:
(1)静态数据成员
1)对于非静态数据成员,每个类对象都有自己的复制品(成员),而静态数据成员被当作是类的成员。无论这个雷的对象被定义了多少个,静态数据成员在程序中也只有一份复制品,该类的所有对象共享。
2)静态成员存储在全局数据区,定义是就要分配空间,因此不能再类声明中定义,没有产生类对象时期作用域就可见,就可以使用它。
3)static成员变量的初始化在类外,不加static关键字
总的来说,使用静态数据成员优势是静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性,同时 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能

#include <iostream.h>
class Myclass
{
public:
   Myclass(int a,int b,int c);
   void GetSum();
private:
   int a,b,c;
   static int Sum;//声明静态数据成员!!!!!!!!!!!!!
};
int Myclass::Sum=0;//定义并初始化静态数据成员!!!!!!!!!!
Myclass::Myclass(int a,int b,int c)
{
   this->a=a;
   this->b=b;
   this->c=c;
   Sum+=a+b+c;
}
void Myclass::GetSum()
{
   cout<<"Sum="<<Sum<<endl;
}
void main()
{
   Myclass M(1,2,3);
   M.GetSum();
   Myclass N(4,5,6);
   N.GetSum();
   M.GetSum();
}

(2)静态成员函数
1)无法访问属于类对象的非静态数据成员,也无法访问非晶态成员函数,只能调用其余的静态成员函数。
2)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长
3)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)

#include <iostream.h>
class Myclass
{
public:
   Myclass(int a,int b,int c);
   static void GetSum();/声明静态成员函数
private:
   int a,b,c;
   static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
   this->a=a;
   this->b=b;
   this->c=c;
   Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{
  // cout<<a<<endl; //错误代码,a是非静态数据成员
   cout<<"Sum="<<Sum<<endl;
}
void main()
{
   Myclass M(1,2,3);
   M.GetSum();//调用方法1
   Myclass N(4,5,6);
   N.GetSum();
   Myclass::GetSum();//调用方法2
}

猜你喜欢

转载自blog.csdn.net/wangshuailpp/article/details/79883357