本文主要介绍C静态成员变量的相关信息,帮助你更好的理解和学习C,有兴趣的朋友可以了解一下。
定义类时,只声明静态成员,静态成员的定义和初始化应该在类外完成。
C static关键字of可以修改类成员变量/方法,表示变量/方法不从属于特定对象,而是属于类。仔细考虑静态成员变量会发现,它们与C的方式既兼容又矛盾,具有特殊性。
先说兼容的一面。带有声明和定义的C/c语句:声明给出签名,定义给出具体实现。对于一个类型,声明可能不知道它的对象占用的空间,但是可以根据定义明确确定内存占用。之所以说静态成员兼容C模式,是因为它们的初始化模式与方法的定义一致。下面是一个例子:
//Foo.hpp
命名空间tlanyan {
//类声明和定义
Foo类
私人:
//声明静态成员
静态int值;
公共:
//方法声明
void increase value();
int getValue()const;
};
}
//Foo.cpp
命名空间tlanyan {
//定义静态成员变量并初始化它们
int Foo:value=0;
//类方法定义
void Foo:increaseValue() {
价值;
}
int Foo:getValue() {
返回值;
}
}
与兼容点相比,静态成员变量表现出更怪异的一面。以下是个人总结:
静态成员不能在类中初始化;非静态成员可以直接初始化。静态成员只在类中声明,所以不能直接初始化。const补充的静态成员可以直接初始化,但那是const的能力,不是Static的;
静态成员的初始化需要在类外定义时完成;
初始化不受访问修饰符的限制;私有类型的静态成员可以直接访问和赋值;
静态成员可以在初始化的时候调用函数,也可以直接调用自己类的私有函数。
第四点更重要。在不支持C 11的编译器上,要完成静态映射成员,必须借助函数返回:
#包含地图
//类定义
Foo类
私人:
std:mapconst char*,int maps
.
}
//静态成员初始化
std:mapconst char*,int Foo:maps=Foo:init map();
//或者使用全局函数
std:mapconst char*,int Foo:maps=init map();
C 11引入了统一初始化和lambda表达式,初始化的编写更简单:
//统一初始化
std:mapconst char*,int Foo:maps {
{'a ',31},
{'b ',32}
};
//lambda表达式模式
std:mapconst char*,int Foo:maps=[] {
mapconst char*,int _ map
_map.insert(mapconst char*,int:value_type('a ',31));
_map.insert(mapconst char*,int:value_type('a ',32));
return _ map
}();
静态成员的这些异常行为很容易与全局变量联系在一起,它们有很多相似之处:程序启动前完成初始化,程序终止后销毁;存储位置是静态存储区域,而不是堆栈;通过命名空间运算符获取值;通过非函数块中的函数调用或lambda表达式进行初始化…
虽然各种面向对象编程语言都有静态变量,而且使用的比例不低。但是从面向对象的角度来看,静态成员是全局变量的另一种形式,它破坏了隔离和封装,增加了类之间的耦合性,增加了测试的难度。在实践中,应该谨慎使用全局变量,并加强对它们的访问权限。
所以本质上静态成员也是全局变量,只是属于特定类的名字。
以上是对C静态成员变量的详细解释。更多关于C静态成员变量的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。