标签:地址 return 对象 静态成员函数 开头 blank style rtu 工程
理解static关键字之前首先回顾一下C/C++程序的在内存中的分配情况。从低地址到高地址依次分为:代码区、全局数据区、堆区、栈区。函数之外的全局变量和静态变量(包括全局变量和静态变量)都存储在全局数据区,堆区有程序员自己通过malloc,new申请内存,栈区存放函数内部的临时变量,随着函数的退出而释放内存。
静态全局变量和普通全局变量的区别:
例如:当n是全局变量是可以正常通过的,当n定义为静态全局变量是无法编译通过的
//Example2 //File1第一个代码文件的代码 #include<iostream> #include "example2.h" int n; //定义静态全局变量 void main() { n=20; std::cout<<n<<std::endl; //20 fn(); //21 } //File2第二个代码文件的代码 #include<iostream.h> extern int n; void fn() { n++; std::cout << n << endl; }
我们知道定义在函数内部的局部变量存放在栈区,随着程序退出函数,系统会回收栈内存,局部变量会失效。有些时候需要通过引入静态局部变量,将局部变量存放在全局数据区。静态局部变脸只在第一次初始化,每次的值保存到下一次调用,始终驻留在全局数据区,直到程序退出。静态全局变量的作用域没有改变,依然是局部的。
#include<iostream> using namespace std; void fn(); void main() { fn(); fn(); fn(); } void fn() { static int n=10; cout << n << endl; n++; }
关于静态函数限制函数作用域的做法,我C++试验了一下,发现已经不起作用了。另一方面确实很少使用,就不多讲了。C++面向对象中,比较关键的是静态成员、静态成员函数。
1 #include<iostream> 2 using namespace std; 3 class Myclass { 4 public: 5 Myclass(int a, int b, int c); 6 static void GetSum(); //声明静态成员函数 7 private: 8 int a, b, c; 9 static int Sum; //声明静态数据成员 10 11 }; 12 int Myclass::Sum = 0; //定义并初始化静态数据成员 13 14 Myclass::Myclass(int a, int b, int c) { 15 this->a = a; 16 this->b = b; 17 this->c = c; 18 Sum += a + b + c; //非静态成员函数可以访问静态数据成员 19 } 20 void Myclass::GetSum() { //静态成员函数实现 21 //cout << a << endl; // error,a是非静态成员 22 cout << "Sum=" << Sum << endl; 23 } 24 int main() { 25 cout << sizeof(Myclass) << endl; //静态成员不占用对象空间 26 Myclass M(1, 2, 3); 27 M.GetSum(); 28 Myclass::GetSum(); //静态成员函数访问 29 Myclass N(4, 5, 6); 30 N.GetSum(); 31 M.GetSum(); 32 return 0; 33 }
标签:地址 return 对象 静态成员函数 开头 blank style rtu 工程
原文地址:http://www.cnblogs.com/wxquare/p/6692924.html