C++ static关键字
来源:互联网 发布:windows xp 键盘鼠标 编辑:程序博客网 时间:2024/06/07 03:49
c++ static 关键字
static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。
面向过程中的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的值}
静态全局变量的特点:未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0); 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
注意:全局变量和全局静态变量的区别
- 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>class Myclass{ 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();}
特点:不管这个类创建了多少个对象,其静态成员在内存中只保留一份拷贝,这个拷贝为该类的所有对象共享。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
静态成员两个必不可少的部分:类内声明、类外初始化
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<;数据类型><;类名>::<;静态数据成员名>=<;值>
类的静态数据成员有两种访问形式:
<;类对象名>.<;静态数据成员名> 或 <;类类型名>::<;静态数据成员名>
- 静态成员函数
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();}
静态成员函数可以在类内定义。也可以在类内声明,类外定义。当在类外定义时,不能再使用static关键字作为前缀
- 调用方法
-1 类名::静态成员函数
如上所示
Myclass::GetSum();
-2 对象.静态成员函数
如上所示
M.GetSum();
通过对象调用静态成员函数需要注意:
1、通过对象访问静态成员函数的前提条件为对象已经建立 2、静态成员函数的访问权限同普通成员函数一样 3、静态成员函数也可以省略参数、使用默认形参值、以及进行重载。
静态成员函数与普通成、成员函数在使用上的区别:由于静态成员函数在类中只有一个拷贝,因此他访问对象的成员要收到一些闲置:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中的非静态成员;如果要访问非静态成员,必须通过参数传递的方式得到相应的对象,再通过对象来访问。还需要注意的是:由于静态成员是独立于对象存在,因此静态成员没有this指针。
1 0
- c/c++-----static关键字
- 【C/C++】关键字static
- c/c++static关键字
- C++-static 关键字
- c/c++ static关键字
- C 关键字extern、static
- c语言关键字static
- C/C++ static 关键字
- c static关键字理解
- c++static关键字
- C关键字--static
- c语言static关键字
- C语言关键字static
- C语言static关键字
- c中static关键字
- 关键字static(c语言)
- C语言-关键字static
- C static 关键字
- 用户画像
- MATLAB神经网络编程(二)——线性神经网络
- poj 3322 Bloxorz I【广度优先搜索】
- 通过打开android应用市场来定位你的app
- IBM WebSphere MQ命令
- C++ static关键字
- mysql如何让自增id从1开始设置方法
- Linux 搭建SVN 服务器
- HDU 2203 亲和串【字符串函数的使用】
- 大小写字母转换
- [ring3反作弊篇] 基于EBP遍历调用栈及模块名
- 基本的数据类型和引用数据类型的区别
- Failed to read row 0, column -1 from a CursorWindow which h
- Android--数据传递