#include <iostream>
using namespace std;
#if 0
static
全局变量 外链性(external link),仅限于本文件,也就是限定了作用域
局部变量auto:static影响了生命周期(和main()函数的生命周期是一样的)和存储位置(不存储在栈上了,而是存储在data段上的rw段
如果未初始化了就在bss段)
重要注释:
①RO_data:ReadOnly data,即只读数据域,它指程序中用到的只读数据,全局变量,例如C语言中const关键字定义的全局变量就
是典型的RO-data。
②RW_data:ReadWrite data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运
行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如全局变量或者静态变量,且定义时赋予“非0值”给该变量进行初始化。
③ZI_data:ZeroInitialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW_data的区别是程序刚运行时这
些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。包括未初始化的
全局变量,和初始化为0的全局变量。
④RO:只读区域,包括RO_data和code。
⑤Code:即代码域,它指的是编译器生成的机器指令。
⑥BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
⑦数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
⑧代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运
行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读
的常数变量,例如字符串常量等。
#endif
#if 0
static 在类内部的表现,用来实现族类对象间的数据共享。
在生成对象的时候,普通数据成员才有空间。而static成员在类声明的时候,就已经开辟了空间(data rw)
static数据成员,即属于类,也属于对象,但终归属于类。
1、初始化:类内定义,类外初始化。type 类名::变量名 = 初值
2、使用:static数据成员,即属于类,也属于对象,但终归属于类。
;
#endif
namespace Space
{
int share = 1111;
}
class A
{
public:
void func()
{
cout<<share<<endl;
}
void modify(int m)
{
share = m;
}
int x, y;
static int share;
};
int A::share = 100;
int main()
{
A a, b, c;
/*cout<<"sizeof(A)= "<<sizeof(A)<<endl;//8
cout<<"sizeof(a)= "<<sizeof(a)<<endl;//8
cout<<"sizeof(b)= "<<sizeof(b)<<endl;//8
cout<<"sizeof(c)= "<<sizeof(c)<<endl;//8
a.func();*/
/*
a.func();
a.modify(2000);
b.func(); //修改成功
*/
cout<<A::share<<endl;//在没有类对象的时候,我可以通过类名访问你,这就是为什么说终归属于类
cout<<Space::share<<endl;
return 0;
}
#include <iostream>
using namespace std;
//static修饰成员函数,它的作用只有一个,用于管理static成员
//static修饰的成员函数,即属于类,也属于对象,但终归属于类
//static修饰的成员函数,因为它属于类,所以没有this指针,不能访问非static 数据成员及成员函数
class School
{
public:
string& getTower()
{
return tower;
}
static string& getLib()
{
tower = "abcd";//这一句报错,因为调用getLib()函数时无法把对象的指针传进来,所以函数根本分不清这是
//哪一个对象的tower
return lib;
}
private:
string tower;
string lake;
static string lib;
};
string School::lib = "";
int main()
{
School::getLib() = "abcd";//不需要对象就可以被调用
School::getLib() += "efgh";
School cz, bn, blueshit;
cz.getTower() = "boyala";
bn.getTower() = "shuita";
blueshit.getTower() = "wajueta";
cz.getLib() += "传值就职";
bn.getLib() += "鸟人";
blueshit.getLib() += "挖掘机";
cout<<cz.getLib()<<endl;
return 0;
}