C++静态成员

 静态成员(数据成员和函数成员)
不管这个类创建了多少个对象,而静态成员 只有一个副本这个副本被所有本类对象共享
(1) 静态数据成员
当这个类的 第一个对象建立时,所有static数据都被初始化,并且,以后再建立对象时,不需再对其初始化。
当类中含static成员时,需要在函数外部对其进行初始化,格式为:type classname::staticfield = initValue; //也可以不对其赋值,此时将使用系统默认值或者默认构造函数
例如:
class test
{
public:
virtual ~test(){}
static int &getInstance(){return _instance;}
public:
static int _instance; 
string testString;
test()
{
 testString = "public string";
}
};
int i;
int test::_instance;
int main()
{
test *pIntrObj = new test();
printf("Intral Object Address: <%X>!\n", pIntrObj);
printf("static object Value: <%d>, Address: <%X>!\n", pIntrObj->_instance, &(pIntrObj->_instance));
pIntrObj->_instance = 1;
delete pIntrObj;
pIntrObj = NULL;

printf("External Object Value: <%d>, Address: <%X>!\n", test::_instance, &(test::getInstance()));
printf("i Address: <%X>!\n", &i);

getchar();
return 0;
}
(1)VS2005运行结果:


(2)如果去掉外部声明的“int test::_instance;”语句,将出现如下链接错误:
1>LINK : 没有找到 E:\testing\staticInstance\Debug\main.exe 或上一个增量链接没有生成它;正在执行完全链接
1>test.obj : error LNK2001:   无法解析的外部符号 "public: static int test::_instance" (?_instance@test@@2HA)
1>E:\testing\staticInstance\Debug\main.exe : fatal error LNK1120: 1 个 无法解析的外部命令
解析: 创建一个类对象,并不能同时创建static成员变量,static成员需要在使用该类之前初始化。

(3)修改代码:
int i;
int test::_instance;
int main()
{
printf("External Object Address: <%X>!\n", &(test::getInstance()));
printf("i Address: <%X>!\n", &i);

getchar();
return 0;
}
VS2005运行结果:

解析: 静态成员变量与对象的创建没有关系,不受局部对象个数的限制。静态成员变量和静态成员函数可以看成:“类”这个大集体中的一个“小团体”,它们在函数外部单独初始化,并且占据全局的静态存储区域。所有本类对象共享静态成员变量
疑问: 在外部初始化static成员时,是否同时建立了一个类对象呢?——猜想:没有建立。

(2)静态成员函数 
静态成员函数属于整个类,为此类所有对象共享。
一般的成员函数中都含有一个 this指针,用来指向对象自身;而在静态成员函数中 没有this指针,因为它无需判别究竟执行它的是哪一个对象,它是同类所有对象共享的资源,只有一个共用的副本。因此,一般 静态成员函数都是访问 静态数据成员全局变量。如果要让静态成员函数访问普通数据成员,需要通过 参数传递形式传递 对象指针,以告知静态成员函数需要访问哪个对象的普通数据成员,形如 obj.static_func(obj)
注意: 静态成员函数虽然不针对某一特定对象,但在使用时系统中必须已经存在该类对象。(静态数据成员在第一个对象建立时初始化)    //这个是错误的!!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值