C++的 static,大牛轻砸
时间:2010-06-28
来源:互联网
C 里面 static 的用处太多,这里只谈 C++ 中比 C 增加的作用:在类或结构体中修饰对象属性和成员方法
通常我们声明类或结构体的时候,是因为我们抽象了一类数据的特征。
然后倒过头来,我们给这些特征起个名字(即类名),用来描述这一类对象。
这些对象通常都是两两不相关的,但有些时候,我确实希望他们相关。
例如以下的建模,static 的经典作用。
设计有一个动物类,并且希望统计动物的总数,怎样做最方便?
创建了一个动物的实体,就将数字增加一
- class Animal {
- private:
- static unsigned int total_number;
- protected:
-
- // 不允许建立Animal实例,因为是抽象的,但子类用得上。
- Animal(void) {
- ++total_number;
- };
-
- // 这个不是 virtual的,不然就失效了
- ~Animal(void) {
- -- total_number;
- };
-
- public:
- static unsigned int number(void) {
- return total_number;
- }
- };
-
- // 猫科动物,顺便也统计一下猫科动物的数量
- class Feline : public Animal {
- private:
- static unsigned int feline_number;
- protected:
-
- // 显式调用 超类 Animal的构造函数
- Feline(void) : Animal() {
- ++feline_number;
- }
-
- ~Feline(void) {
- -- feline_number;
- }
-
- public:
- static unsigned int number(void) {
- return feline_number;
- }
- };
-
- // 犬科动物,顺便也统计一下犬科动物的数量
- class Canine: public Animal {
- private:
- static unsigned int canine_number;
- protected:
-
- // 显式调用 超类 Animal的构造函数
- Canine(void) : Animal() {
- ++canine_number;
- }
-
- ~Canine(void) {
- -- canine_number;
- }
-
- public:
- static unsigned int number(void) {
- return canine_number;
- }
- };
-
- class Cat : public Feline {
- };
-
- class Lion : public Feline {
- };
-
- class Dog: public Canine {
- };
-
- int main(void) {
-
- Cat cat;
- Lion lion;
- Tiger tiger;
- Dog groovy, jerry;
-
- std::cout<<Animal::number()<<std::endl;
- std::cout<<Feline::number()<<std::end;
- std::cout<<Canine::number()<<std::endl;
-
- };
static 修饰的成员变量,无论有多少个对象,都只有一份
static 修饰的成员方法不会被继承,因为它不会被改写为 thiscall (带this参数的方法),
所以里面也不可以调用任何非static的成员函数,当然也不可以加const修饰
其实使用 static 修饰, 跟在C 里面添加了一个 全局变量、全局函数没什么区别
只是在C++之中,在不使用 命名空间的情况下,也可以将这些 “准全局变量”“准全局函数”的名字保护起来,不污染整个全局命名空间。
并且可以使用OO的封装特性,不允许其他代码随意修改或调用。
作者: xyfree 发布时间: 2010-06-28
作者: rain_fish 发布时间: 2010-06-28

作者: koolcoy 发布时间: 2010-06-28
本来还想说,Java C++ C# 什么的主流OO语言,static 在语言里面的这个用法其实是权宜之计。
不过这个要说的东西太多了,加上本来这帖子就是为某些精通C但又不是很懂C++的人看的,就不废话那么多了(虽然还是很废话)
作者: xyfree 发布时间: 2010-06-28
作者: ah13k 发布时间: 2010-06-28
singleton pattern可能会用到static
作者: yangyuke 发布时间: 2010-06-28
return total_number;
}
请教一下楼主
这个static 究竟是修饰number还是unsigned
作者: pmerofc 发布时间: 2010-06-28
本来还想说,Java C++ C# 什么的主流OO语言,static 在语言里面的这个用法其实是权宜之计。
xyfree 发表于 2010-06-28 18:17
谁让这些狗屁的主流OO语言连free function都不支持。
class math {
static min
static max
static log
static floor
狗屁
作者: OwnWaterloo 发布时间: 2010-06-28
C++支持的吧?
可是即使支持free function,使用 static 依然是一个权宜之计。
因为 static 这种东西,它的生命周期似乎是很长的,但实际上也应该可以由程序员来管理,
但是很少语言有提供程序员这个能力,Java做得多一点点,提供一个 transient 关键字
作者: xyfree 发布时间: 2010-06-28
晕, C++被夹在中间……
作者: OwnWaterloo 发布时间: 2010-06-28
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28