标签:
内容截取自http://blog.csdn.net/hackbuteer1/article/details/7487694
C++的关键字static分两种用法:在面向过程程序设计(c语言中的普通变量和函数)中的使用和在面向对象程序设计(c++中的类)中的使用。
一、面向过程程序设计中的static(静态变量、静态函数)
程序在内存中的分布:
代码区 |
全局数据区 |
堆区 |
栈区 |
1. 静态全局变量
看如下例子:
#include<iostream> using namespace std; static int n; //定义静态全局变量 void fn() { n++; cout<<n<<endl; } int main(void) { n = 20; cout<<n<<endl; fn(); return 0; }
静态全局变量的特点:
2. 静态局部变量
例子:
#include<iostream> using namespace std; void fn(); int main(void) { fn(); fn(); fn(); return 0; } void fn() { static int n = 10; cout<<n<<endl; n++; }
普通局部变量:每次调用函数时,系统会分配栈内存给该局部变量。随着函数退出,又会回收栈内存,变量失效。
静态局部变量:保存在全局数据区,只分配一次内存,每次调用可以更新改值,只能在局部区域使用(相比于静态全局变量)。
静态局部变量的特点
3. 静态函数
#include<iostream> using namespace std; static void fn(); //声明静态函数 int main(void) { fn(); return 0; } void fn() //定义静态函数 { int n = 10; cout<<n<<endl; }
静态函数特点:
二、面向对象程序设计中的static(静态数据成员(类)、静态成员函数)
1、静态数据成员
#include<iostream> using namespace std; class Myclass { private: int a , b , c; static int sum; //声明静态数据成员 public: Myclass(int a , int b , int c); void GetSum(); }; 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; } int main(void) { Myclass M(1 , 2 , 3); M.GetSum(); Myclass N(4 , 5 , 6); N.GetSum(); M.GetSum(); return 0; }
静态数据成员特点:
与全局变量相比,静态数据成员:
2、静态成员函数
是类的内部实现,属于类定义的一部分。不属于某个类对象,而属于类所有对象。
普通成员函数隐含了this指针(缺省),它指向类对象本身,如函数func()实际为this->func()。
静态成员函数不含this指针,因为不与任何对象相关。无法访问类对象的非静态数据成员和非静态成员函数,只能调用静态成员函数。
例子:
#include<iostream> using namespace std; class Myclass { private: int a , b , c; static int sum; //声明静态数据成员 public: Myclass(int a , int b , int c); static void GetSum(); //声明静态成员函数 }; 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; } int main(void) { Myclass M(1 , 2 , 3); M.GetSum(); Myclass N(4 , 5 , 6); N.GetSum(); Myclass::GetSum(); return 0; }
静态成员函数特点:
与全局函数相比,静态成员函数:
访问速度更快,因为没有this指针的额外开销
标签:
原文地址:http://www.cnblogs.com/xiaovid/p/4450907.html