C++ static关键字
c++ static 关键字
面向过程中的static
- 静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。
#include<iostream>
usingnamespace std;
void fn(); //声明函数
static int n; //声明静态全局变量
void main()
{
n=20; //为n赋初值
printf("%d",n);//输出n的值
fn(); //调用fn函数
}
void fn()
{
n++; //n的值自加一(n=n+1)
printf("%d",n); //输出n的值
}
注意:全局变量和全局静态变量的区别
- 1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
-
2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。
- 静态局部变量
#include<iostream.h>
void fn();
void main()
{
fn();
fn();
fn();
}
void fn()
{
static int n=10;
printf("%d",n);
n++;
}
有人会说,为什么不用全局变凉呢?如果用全局变量,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
- 静态函数
#include<iostream.h>
static void fn();//声明静态函数
void main()
{
fn();
}
void fn()//定义静态函数
{
intn=10;
printf("%d",n);
}
面向对象中的static
-静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。
#include<iostream.h>
classMyclass
{
public:
Myclass(inta,intb,intc);
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
intMyclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(inta,intb,intc)
{
this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c;
}
voidMyclass::GetSum()
{
cout<<"Sum="<<Sum<<endl;
}
voidmain()
{
MyclassM(1,2,3);
M.GetSum();
MyclassN(4,5,6);
N.GetSum();
M.GetSum();
}
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<;数据类型><;类名>::<;静态数据成员名>=<;值>
类的静态数据成员有两种访问形式:
<;类对象名>.<;静态数据成员名> 或 <;类类型名>::<;静态数据成员名>
- 静态成员函数
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();
Myclass N(4,5,6);
N.GetSum();
Myclass::GetSum();
}
- 调用方法
-1 类名::静态成员函数
如上所示
Myclass::GetSum();
-2 对象.静态成员函数
如上所示
M.GetSum();
1、通过对象访问静态成员函数的前提条件为对象已经简历
2、静态成员函数的访问权限同普通成员函数一样
3、静态成员函数也可以省略参数、使用默认形参值、以及进行重载。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。