作者lihgong (当宪兵是我一辈子的耻辱)
看板C_and_CPP
标题[心得] C++ study note vol.2 (about static variable/function)
时间Sat Feb 21 23:02:14 2009
C++ 的 class 是很好的工具
也是很神秘的工具
这篇要来讲一下, 什麽是
static member variable
static member function
----
static member variable 的性质很简单
他就是 global variable, 拿来存一些重要的参数
一般我们写程式, 会把一些常用的变数, 大家都会用的变数宣告成 global
然後所有 function 就用同一份变数, 大家 share 他
static member function 也有一样的性质
他不会随着每次物件创造出来, 就会多一份 copy
如果没有 static member variable, 程式设计师还是会用 global variable 达成目的
只是这样看起来比较不优雅, 因为 global variable 一个又一个穿插在 code 里
感觉很乱, 也不知道附属於哪些函数, 管理上很麻烦
static member variable 的存在, 只是彰显了 global variable 的功能
包括他隶属於哪些功能, 应该被哪些函数使用, 和哪些东西相关
但是骨子里, 他就是 GLOBAL VARIABLE !!
----
C++ 的书会告诉你, 存取 static member variable, 必须要用 static member function
同样的事, 我可以在 C语言找到对应的故事...
通常写得很差劲的 C code, 你会看到乱无章法的 global variable
可能在一堆 code 里, 会看到某个地方读他, 某个地方写他, 而且是直接操作...
如果哪天, 我们希望修改 global variable 的定义, 或是修改存取的规则
接下来精彩了, 你要把所有程式码翻出来, 修改所有操作 global variable 的地方
这是为什麽有经验的程式员会告诉你:
存取 global variable, 最好透过 function 去操作
这是为了避免修改时的痛苦, 让你只要改一个地方, 所有地方一起受惠
----
static member function 就跟上一段说的 global variable 操作函数意义一样
他是负责来读/写这些 global variable 的
我们希望这些操作, 能够统一集中在一起, 放在 class 里, 彰显他们的用途
并且放在 class 里, 能提高程式码的内聚性, 意思是说
"功能一样或相关的 code 放在一起, 有帮助维护"
程式写久了, 大家一开始是 design for speed
後来会发现, 其实 maintain 才是痛苦的根源...
於是有 design for maintain 的想法
这跟设计硬体一样, 为了让生产更容易, 良率更高
逐渐发展出 design for manufacture 的设计哲学是一样的
----
最後是关於 member function 和 static member function 的差异
C++ 的书会告诉你说, static member function 不能存取 member variable
WHY?
这要从 C++ 的物件模型说起
int a = 1000;
CObjcet obj;
obj.qqq(a);
呼叫 obj 里的 member function qqq()
表面上看起来, 只传了一个 int 进去, 真的只传这些东西进去吗 ?
错 !!
其实 C++ 的 compiler, 会自动补一个指标传进去, 像是这样...
obj.qqq(a, &obj)
这就是为什麽, 明明 member function 只有一份, 却不会存取到一样的变数
附带一提, 在 C++ 的 member function 里, 可以使用 this 这个指标
这个指标从哪儿来的, 答案应该很明显了... 编译器补的 &obj 送上的~
----
我讲了这麽多, 还没讲到 static member function 和 member function 有什麽不同
答案很简单, 就是 static member function 呼叫时, 他不会附赠 this 这个指标
所以你会在书上看到说, static member function 不能存取 member variable
这是根本的原因
写在一开始, static member variable, 其实是 global variable
static member function, 其实是存取这些 global variable 的函数
只是我们把这两样东西放进 class 里, 换个名字
表面上看起来是新的规则, 其实他们是旧的设计法则
只是用更精巧的方式包装, 变成一些规则
所以 static member function 的本质, 是一些工具函数, 如此而已
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.90.225
1F:推 bobhsiao:推一下 02/21 23:17
2F:推 tinlans:其实还有一个关键点,指向 static member function 的 02/22 00:03
3F:→ tinlans:pointer type 跟 member function pointer 不同。 02/22 00:04
4F:→ tinlans:所以 static member function 可以被丢进 C 式 API。 02/22 00:05
5F:→ softwind:class 和 object 基本上没有太大关系... 02/22 00:39
6F:推 avhacker:真要把 non member 集中在一起,不然放 namespace 中 02/22 00:57
7F:→ avhacker:将 stand alone function/variable 放 namespace 之中 02/22 00:57
8F:→ Splash5:看machine code也可以了解一些处理机制和真正本质 02/22 03:10