#include <iostream>
using namespace std;
/**
*
*
* C++ 语言的 static 关键字有二种用途:
当然以上的几种,也可以用在c++中。还有额外的两种用法:
1.静态数据成员:用于修饰 class 的数据成员,即所谓“静态成员”。
这种数据成员的生存期大于 class 的对象(实体 instance)。
静态数据成员是每个 class 有一份,普通数据成员是每个 instance 有一份,
因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。
*/
class A
{
public:
A():k(99),z(1),con(66) {
}
~A(){
}
int k;
int z;
// static int sta = 10;//error
static int sta;//静态成员变量的引用性说明 必须这样
const int con; //只可以线性列表初始化
const int uu = 12;
const static int ui = 66;
static const int ii = 50;
//参见就java
static void func(){
cout<< "i am satic function...\n";
int wb = 10;
static int kkk = 12;
}
};
int A::sta = 10;//静态成员变量的定义性说明 早于对象的建立必须先建立
static int s = 1; //全局非成员变量的static参见c的static
int main(int argc, char *argv[])
{
A a;
// a.k = 3;
// a.sta = 88; error sta 不属于哪个具体的对象
/*
一言以蔽之:
&C::v_取的是成员在类中的偏移量。
&(C::v_)取得是对象中成员变量实际的指针地址。
如果你的v_是public的,那么 &(C::v_)其含义如同 &c.v_ (c是C的对象)
*/
cout << "address a.k = "<< &(a.k) << endl; //实际地址
cout << "address a.k = "<< &a.k<< endl;
cout << "address a.z = "<< &(a.z) << endl; //实际地址
cout << "address a.z = "<< &a.z<< endl;
cout << a.k << endl;
A b;
//测试static修饰的变量 不是属于哪个具体的对象的 而是共有的
#if 1
cout << A::sta<<endl;
cout << a.sta<< endl;
a.sta = 22;
cout << a.sta<< endl;
cout << b.sta<< endl;
b.sta = 111;
cout << a.sta<< endl;
#endif
static int j = 90; //static 变量参考c的static
cout << j<<endl;
//测试static const
cout<<"..........\n";
#if 1
cout << "a.ii = " << a.A::ii << endl;
cout << "b.ii = " << b.ii << endl;
#endif
a.func();
cout << "Hello World!" << endl;
return 0;
}
/*那么静态成员函数有特点呢?
1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
3.静态成员函数不能访问非静态成员函数和非静态数据成员;
4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的
指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)*/
虚拟地址空间:::4GB
BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。
数据段包括初始化的数据和未初始化的数据(BSS)两部分[1] 。BSS段存放的是未初始化的全局变量和静态变量。
UNIX下可使用size命令查看可执行文件的段大小信息。如size a.out。*/