C++静态成员

来源:互联网 发布:淘宝客服一般什么待遇 编辑:程序博客网 时间:2024/05/21 07:55
 静态成员(数据成员和函数成员)
不管这个类创建了多少个对象,而静态成员只有一个副本这个副本被所有本类对象共享
(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)
注意:静态成员函数虽然不针对某一特定对象,但在使用时系统中必须已经存在该类对象。(静态数据成员在第一个对象建立时初始化)  //这个是错误的!!!!


原创粉丝点击