C_and_CPP 板


LINE

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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP