2016/04/25

static 與 const 關鍵字的用法與差異


static 與 const 原文都有 "固定的" 或 "不變的" 意思,如果放在 C++ 的 class 當中又是怎麼使用呢? 讓我們用以下範例解釋:

#include <iostream>
using namespace std;

class Demo {
 public:
  Demo() {
   cout << "*** construct new object  ***" << endl;
   static_count++;
   count++;
  }

  static int get_static_count() {
   cout << "static member \"static_count\" : " << static_count << endl;
   return 0;
  }

  int get_count() {
   cout << "non-static member \"count\" : " << count << endl;
   return 0;
  }

 private:
  const int const_count = 0;
  static int static_count;
  int count = 0;
};

int Demo::static_count = 0;

int main(void) {

 Demo d1;
 Demo::get_static_count(); 
 d1.get_count();
 cout << "----------------" << endl;

 Demo d2;
 d2.get_static_count(); 
 d2.get_count();
 cout << "----------------" << endl;

 Demo d3;
 d3.get_static_count(); 
 d3.get_count();
 cout << "----------------" << endl;

 return 0;
}

執行的結果如下所示:

*** construct new object ***
static member "sta_count" : 1
non-static member "count" : 1
----------------
*** construct new object ***
static member "sta_count" : 2
non-static member "count" : 1
----------------
*** construct new object ***
static member "sta_count" : 3
non-static member "count" : 1
----------------

在這個範例中 class "Demo" 有2個成員,初始值都設為0
static int sta_count;
int count = 0;
static 類型的成員只能在 class 之外設值
int Demo::static_count = 0;
我們用 class "Demo" 建立了 3 個物件,
每次新物件建立時,sta_count 以及 count 都做 +1 的動作

執行的結果顯示,"非" static 的變數每次都會隨著新物件 reset 為初始值
而 static 類型的變數,在整個程式中就是單獨唯一的,不會隨著新物件建立而產生新的副本
所以 static int sta_count 會累積數值,int count 不會

而設定為 const 類型的變數,則不能作任何更動
如 const_count ++ 編譯時會顯示錯誤

使用 Google 雲端放置網站用的 CSS 與 JavaScript 檔案 (過時)

新版請參考此篇

2016/04/19

二進位的負數如何表示


這是一個二進位的小問題. 在電腦的世界裡, 使用二進位表示法來存放數字是再單純不過的.
不過數字為能有更佳的效率, 有一些設計是很重要的, 例如用二的補數來表示負數, 以下為一個例子.

假設用一個 byte 來代表數字的話, 則共有8個bit可用, 最高字元保留給符號,
而數字就用二進位法來放, 所以8個bit表示如下:
7-6-5-4-3-2-1-0

其中第0個bit最右側, 也就是最低位元, 最左邊是第7個bit, 也就是最高位元.
接下來要說明數字囉

00000001 (b)=1(d)
00000010(b)=2(d)
00000100(b)=4(d)
00010101(b)=21(d)

…. 以此類推, 而最大正數可以用這個表示, 除了第7個bit不動, 其餘都是1的話:
01111111(b)=127(d)

好, 接下來看負數怎麼表示. 先來看所謂二的補數,  
二的補數(two’s complement)就是將位元反置後再加一, 來看一個例子:
25(d)=00011001(b)

而要代表-25的二進位數, 則用 00011001(b)反置後再加一
1. 反置 11100110
2. 再加1 得 11100111,
3. 所以得 11100111(b)=-25(d)

再舉一個例子, 2(d)=00000010(b),
1. 反置 11111101,
2. 再加1得 11111110,
3. 所以得11111110(b)=-2(d)

接下來看如何反過來做, 若今天有個值是 110001010(b) 怎麼算回來呢?
1. 先減1, 110001001
2. 再反置得 001110110
3. 所以得 001110110(b)=118(d)
4. 所以 110001010(b)=-118(d)

這樣就行囉!
所以 8個bit的範圍最小到最大就是 -128~127共256個數字.
-----
轉載自 : http://tim.diary.tw/2009/08/24/twos-complement/

2016/04/16

程序導向和物件導向的思維主要區別在哪裡? (轉載)


主要在於切割程式方式的不同。

程序導向用『功能』來切程式,最後再由一個main()來統一管理。

物件導向用『物件』來切程式,各個物件自動自發的負責自己的『功能』,不需main()管理。

這樣的好處是,若需修改程式,通常不用勞師動眾到修改main(),只需修改各自物件即可,若要增加功能,也只需增加物件即可,不用修改main()。

簡單的說,物件導向就是一種『Shift of Responsibility』,一種由『中央集權』變成『地方自治』的管理方式。

-----

Web 技術中的 Session 是什麼?

轉載原文:  Web 技術中的 Session 是什麼? 本文目標 在 Web 的世界裡,Session 已經是被廣泛使用的一種技術,大多數的 Web 開發者,肯定都能運用自如。在現今的各類 Web 應用程式的開發框架和工具中,Session 也已經被包裝成容易使用的模...