星期六, 3月 10, 2007

獨處的時光

獨處與孤單,可以掛上等號嗎?

周遭的人離去,留下空蕩的寢室、寂靜的氣氛還有我。熟悉不過的男三舍,人事已非,充斥著陌生的臉孔、素聞的喧鬧聲。眼前的電腦,呈現一片死寂,我不再蠢蠢欲動。它,取代不了最真實的笑聲。隨著月光的浮現,雙手逐漸沉重。輕盈的鍵盤敲打聲消逝了,取而代之的是鐵塊沉重的撞擊聲。

我想逃,逃出這令人窒息的空間,逃出夜晚的籠照。

這就是我體會過的孤獨!

孤單,是因為無法接受眼前的現實。平時總是與朋友東奔西跑,或聚在寢室裡一同歡笑,突然間,全都消逝了,失落感頓時而生。

在心裡最無力的時候,我想盡所有我現在能做的事。我的確有事做了,然而內心,還是冷冷地顫慄著。

孤單,並不是來自於生活的層面,而是種逃避的心境。
獨處,也是可以很快樂的!

一本生動精采的小說、一篇通情達理的好文、一個心念的轉變、一道多元化的思緒。我已經遺忘了自我,享受我陷入的情境。

做你「真正」想做的事吧!排除任何目的,只為享受。
不要為了等級、破關或勝利而玩;不要為了想獲取而讀書;不要為了無聊而做事。
不要以為做慣的事,就是真正想做的事!!!

獨處,不一定孤單;齊聚,也不見得快樂。

星期四, 3月 08, 2007

Initialization VS Assignment

double d = 3.14;

double d;
d = 3.14;

以上這兩種寫法的表層意義是一樣的;然而,實質上卻完全不同。
前者稱為 Initialization,後者則是 Assignment。

前者只會出現在 Definition,而後者是隨時可用。就效率上來說,Initialization 大於 Assignment,原因在於 Initialization 是在配置出生硬空間時,就在該空間上賦值;而 Assignment 則是先找出該空間所在,再加以賦值。

就 class 來說, Initialization 是喚起 copy constructor;而 Assignment 則喚起 Assignment operator。

對所有 class object 來說,若沒有明確指明 Initialization 仍必然進行 Initialization,也就是喚起 default constructor。
而 built-in type 為 Local or Dynaic 若不指明要 Initialization 則不會進行 Initialization。

Declaration VS Definition

所謂 Declaration,只是告知程式(同時也是告訴我們)有這樣的東西存在,例如:

string s;
extern double d;
int gcd (int a, int b);

除了第一個是宣告也是定義外,後二個只是單純的宣告,而不包含定義。

所謂 Definition,是為該變數(函式)配置空間,並與宣告的名字與型態結合。例如:
vector vec (10);
int gcd (int a, int b) {
if (b == 0)
return a;
return gcd (b, a % b);
}

以上兩者皆是定義。

There must always be exactly one definition for each name in a C++ Program. However, there can be many declarations.

另一個特點在於,只要有宣告,就可以在該 scope 內使用它,但前提是 compiler 要能找到定義所在(需放在全域空間或單純宣告之前),舉個例子:

#include< iostream >
using namespace std;

int main () {
int gcd (int a, int b);
int test = 10;
extern int test;
cout << test << endl;
return 0;
}

int gcd (int a, int b) {
if (b == 0)
return a;
return gcd (b, a % b);
}

其中的 test 及 gcd 都有兩次宣告和一次定義,因為在很多時候,定義時宣告的過程是難以避免的。

計較

不是不愛計較,而是不想計較。

很多事都覺得「算了算了,反正沒多大影響」!(當然有少數事我非堅持不可)
可是,話不說出來真的好嗎?

有時候不講,是不想增添自己的麻煩;而很多事習慣就好,不太超過都ok。

不可能事事都順心如意,忍受是難免的,而我也不喜歡跟別人辯,或是給別人添麻煩,所以想想就算了。只是,這樣下去行嗎?這麼不敢大膽講出自己的想法主張!

我不知道,該如何?

星期三, 3月 07, 2007

implicit conversion

在書上看到以下程式碼(有經過微修)


class complex {
double re, im;
public:
complex (double r = 0, double i = 0) : re (r), im (i) {}
// following skip
};

void f (complex z) {
complex a = 2.3;
complex b = 1/a;
complex c = a + b * complex (1, 2.3);

//.....
}

標示為紅色的部分令我感到訝異,這真的能執行嗎?
因此我自行寫了 test code,果真可以。

每個變數都需以 constructor 初始化,但 complex並非 base type,因此宣告時的 =(assign)與 () (initialization) 是不同的。由於 complex a = 2.3; 的結果與 complex a (2.3); 相同,因此我最初假設這兩行 statament 的意義是一樣的。後來我想到在 constructor 前加上 explicit,預料中的事發生了,原先 compile OK 的 code 出現 error。

在短短一行 complex a = 2.3 牽涉到:

1、implicit conversion
把 double type 2.3 轉換成 complex(這中間呼叫了 constructor)

2、initialization
喚起 copy constructor 初始化 a;

加上 explicit 後 error 的原因在於,explicit 會禁止藉由此 constructor 做 implicit conversion,除非使用者明確要求轉換,也就是 complex a = static_cast < complex > (1.2);

--
還好還記得,不然會被向上學長吊起來 XD

星期二, 3月 06, 2007

Data Abstraction

在《The C++ Programming Language 2/e》中看到一段話:

We could implement this Stack in several ways. It is important that a user doesn't need to know how we do it. As long as we keep the interface unchanged, a user will not be affected if we decide to re-implement Stack.

這一小段話已大略闡述 Abstraction 的精隨,就 class 的層面來說,使用者只需要知道此 class 的用途、有哪些 public member function 可用、及這些 function的使用方式和功能。對於此 class 有哪些 private data member,甚至 member function 如何寫成一概不知,也可說完全沒必要知道。

若牽扯到維護層面,只要 class 的撰寫者不改變任何公開的介面(interface 只是個空殼,實體隨撰寫的考量而變,但功用需維持一致),使用者也就不用做任何變更。這也是 object-oriented programming 的分層維護,撰寫者只需針對自己的 code maintain。

以上只是 Data Abstraction 的一些要點,若進一步鑽研,可以請教向上學長 XD

星期日, 3月 04, 2007

視野

人,為什麼總會忘掉某些重要的事呢?

我們總是不斷想著:「今天有什麼事該做?最近有什麼作業或考試?」因為忙著顧慮身邊的事,而遺忘了身外。當身邊有一群人陪伴時,我們總是只在意著與他們有關的事物,卻很少去想故鄉的家人、朋友們。

這樣的視野,太狹小了!!

想到之前在某篇文章看到的話:「在你身邊會不會早已經有人默默對你付出很久了﹐只是你沒發覺而已呢?」

想到最近微積分課上的事,在拒絕與反駁的同時,是否已考量到更深的層面呢?有主見敢表達非是壞事,然而,是不是得顧慮到他人的感受呢?

又想到國哲學長訂定的罰規及輪流佔場,在這些規定出現之前,系羽整個練羽的情況如何呢?遲到的遲到,睡晚的不來,佔場也幾乎都靠 sogo 和其他學長。

遲到延誤練球進度;不來則這次所教全沒學到,下次學長還要特地為你講解;而佔場,為什麼別人要幫忙佔場?是誰要練球?

更早之前,三明治學長的事:「如果大家都能把別人覺得重要的事,也覺得很重要的話.. 這個世界真的會變得更好」

真的覺得,我們把眼界放得太低了!!