就像鲁班在成为木匠祖师之前也是经过不断练习的。
……
老师傅提出第三个问题:“两个徒弟学成了手艺下山去,师傅送给他们每人一把斧子。大徒弟用斧子挣下了一座金山,二徒弟用斧子在人们心裏刻下了一个名字。你愿意跟哪个徒弟学”鲁班马上回答:“愿意跟第二个学。”老师傅听了哈哈大笑。
老师傅说:“好吧,你都答对了,我就得把你收下。可是向我学艺,就得使用我的家伙。可这家伙,我已经五百年没使唤了,你拿去修理修理吧。”
鲁班把木箱裏的家伙拿出来一看,斧子崩了口子,刨子长满了,凿子又弯又秃,都该拾掇拾掇了。他挽起袖子就在磨刀石上磨起来。他白天磨,晚上磨,磨得膀子都酸了,磨得两手起了血泡,又高又厚的磨刀石,磨得像一道弯弯的月牙。一直磨了七天七夜,斧子磨快了,刨子磨光了,凿子也磨出刃来了,一件件都闪闪发亮 。他一件一件送给老师傅看,老师傅看了不住地点头。
老师傅说:“试试你磨的这把斧子,你去把门前那棵大树砍倒。那棵大树已经长了五百年了。”
鲁班提斧子走到大树下。这棵大树可真粗,几个人都抱不过来;抬头一望,快要顶到天了。他抡起斧子不停地砍,足足砍了十二个白天十二个黑夜,才把这棵大树砍倒。
鲁班提斧子进屋去见师傅。老师傅又说:“试试你磨的这把刨子,你先用斧子把这棵大树砍成一根大柁,再用刨子把它刨光;要光得不留一根毛刺儿,圆得像十五的月亮。”
鲁班转过身,拿斧子和刨子来到门前。他一斧又一斧地砍去了大树的枝,一刨又一刨地刨平了树干上的节疤,足足干了十二个白天十二个黑夜,才把那根大柁刨得又圆又光。
鲁班拿斧子和刨子进屋去见师傅。老师傅又说:“试试你磨的这把凿子,你在大柁上凿两千四百个眼儿:六百个方的,六百个圆的,六百个楞的,六百个扁的。”
鲁班拿起凿子和斧子,来到大柁旁边就凿起来。他凿了一个眼儿又凿一个眼儿,只见一阵阵木屑乱飞。足足凿了十二个白天十二个黑夜,两千四百个眼儿都凿好了:六百个方的,六百个圆的,六百个楞的,六百个扁的。
鲁班带凿子和斧子去见师傅。老师傅笑了,他夸奖鲁班说:“好孩子,我一定把全套手艺都教给你!”说完就把鲁班领到西屋。原来西屋裏摆好多模型,有楼有阁有桥有塔,有桌有椅有箱有柜,各式各样,精致极了,鲁班把眼睛都看花了。老师傅笑说:“你把这些模型拆下来再安上,每个模型都要拆一遍,安一遍,自己专心学,手艺就学好了。”
老师傅说完就走出去了。鲁班拿起这一件,看看那一件,一件也舍不得放下。他把模型一件件擎在手里,翻过来掉过去地看,每一件都认真拆三遍安三遍。每天饭也顾不得吃,觉也顾不得睡。老师傅早上来看他,他在琢磨;晚上来看他,他还在琢磨。老师傅催他睡觉,他随口答应,可是不放下手裏的模型。
鲁班苦学了三年,把所有的手艺都学会了。老师傅还要试试他,把模型全部毁掉,让他重新造。他凭记忆,一件一件都造得跟原来的一模一样。老师傅又提出好多新模型让他造。他一边琢磨一边做,结果都按师傅说的式样做出来了。老师傅非常满意。
……
平时工作中用不到c++里的许多特性和语法,导致在接手别人的项目时总是磕磕绊绊,所以在此我想写一个工程囊括绝大多数特性来对自己的c++水平来个提升。
这是看到了一个挺全的总结……
C++学习大纲
还一个工程UML。
这是我大学期间一门课上老师开卷试卷上的代码,后来偷偷照下来打了出来。里面有关类的知识考察较为犀利,放出来。
#include <iostream>
using namespace std;
//Y类开始=================================================
class Y {
public:
Y();
Y(int j);
Y(const Y&);
Y& operator = (const Y&);
virtual ~Y();
virtual int GetValue() = 0;
static unsigned NY() {
return nY; }
private:
int j;
static unsigned nY;
};
unsigned Y::nY = 0;
Y::Y() {
cout << "default constructor of Y " << endl;
j = 0;
++nY;
}
Y::Y(int j) {
cout << "regular constructor of Y" << endl;
this->j = j;
++nY;
}
Y::Y(const Y& y) {
cout << "copy constructor of Y " << endl;
j = y.j;
++nY;
}
Y& Y::operator=(const Y& y) {
cout << "assignment operator of Y" << endl;
j = y.j;
return *this;
}
Y::~Y() {
cout << "destructon of Y" << endl; }
//X类,继承Y类=============================================
class X : public Y {
public:
X();
X(int i);
X(const X&);
X& operator=(const X&);
~X();
virtual int GetValue() {
return k; }
static unsigned NX() {
return nX; }
private:
int k;
static unsigned nX;
};
unsigned X::nX = 0;
X::X() {
cout << "default constructor of X" << endl;
k = 0;
++nX;
}
X::X(int i) :Y(i) {
cout << "regular constructor of X" << endl;
k = i;
++nX;
}
X::X(const X& x) {
cout << "copy constructor of X" << endl;
k = x.k;
++nX;
}
X& X::operator=(const X& x) {
cout << "assignment operaton of X" << endl;
k = x.k;
return *this;
}
X::~X() {
cout << "destructor of x" << endl; }
X userCode(X b)
{
X c = b;
return c;
}
//main函数开始==================================================
int main() {
cout << "Beginning: Y::NY()=" << Y::NY() << endl;
cout << "Beginning: X::NX()=" << X::NX() << endl;
X a(3);
cout << "calling userCode()" << endl;
X d;
d = userCode(a);
cout << "back to main()" << endl;
cout << "d.GetValue()" << d.GetValue() << endl;
Y*e = new X(7);
cout << "e->GetValue()=" << e->GetValue() << endl;
cout << "before deleting e Y::NY() = " << Y::NY() << endl;
cout << "before deleting e X::NX() = " << X::NX() << endl;
delete e;
cout << "before ending: Y::NY()" << Y::NY() << endl;
cout << "before ending: X::NX()" << X::NX() << endl;
return 0;
}