1、考慮下面的**
#define claa_with_max(a,b) ((a) > (b) ? (a) : (b))
int a = 5,b = 0;
claa_with_max(++a,b); //a被累加二次
claa_with_max(++a,b + 10); //a被累加一次
原因在於
define只是在預編譯的時候替換,而不做別的處理
。因此claa_with_max(++a,b)等效於((++a) > (b) ? (++a) : (b))
2、char greeting = "hello";
char *p = greeting; //non-const pointer,non-const data
const char *p = greeting; //non-const pointer,const data
char* const p = greeting; //const pointer,non-const data
const char* const p = greeting; //const pointer,const data
如果關鍵字const出現在星號左邊,表示被指物是常量;
如果出現在星號的右邊,表示指標自身是常量;
如果出現在星號兩邊,表示被指物和指標兩者都是常量。
3、class textblock
char& operator(std::size_t position)
private:
std::sting text;
};const和non-const兩個版本重複了一些**,如果重複的**量大,則編譯時間、維護等會是乙個大問題。
因此需要實現operator的機能一次並使用它兩次,必須令其中乙個呼叫另乙個,即「常量性轉除」。
class textblock
char& operator(std::size_t position)
private:
std::sting text;
};上面**進行了兩次轉型:第一次用來為*this新增const;第二次則是從const operator的返回值轉除const。
注意:只能用const成員函式實現其non-cast的孿生兄弟,反過來不行。
4、考慮如下類的宣告和類的建構函式的兩種實現方式:
class a
;1)a::a()
2)a::a() : name("test"){}
第1種方法是賦值,但是name並沒有初始化;而第2種方法是初始化,不是賦值操作。初始化的效率一般比賦值的效率高。
對於const和reference型別必須是初始化,賦值操作是不允許的。
成員初始化次序:base classes更早於derived classes被初始化,而class的成員變數總是以其宣告次序被初始化的
。5、如果乙個類沒有宣告其copy建構函式或者過載=函式,則編譯器會自動提供預設的函式。如果不想使用編譯器提供預設的
函式,可以把相應的成員函式宣告為private且不予實現,即可。
6、不能在建構函式或者析構函式中呼叫virtual函式。例如:
class a
virtual void func() const = 0;
...};
class b : public a
virtual void func() const;
...}
當執行b b;會發生的情況:呼叫b的建構函式之前先呼叫a的建構函式,然後執行func()方法。但是在基類a中,func是純虛函式
沒有實現方式,會出現。在這裡,程式不會認為物件是b,而呼叫派生類b的func成員函式。
即:在基類建構函式期間,虛函式不再是虛函式!!!
7、過載operator=需要返回乙個引用型別。即,如果在過載方法是類的成員函式,則return *this。
8、考慮下面**:
class bitmap;
class a
;a& a::operator =(const a& rhs)
如果operator=函式內的rhs和*this是同乙個物件,而會產生問題。delete p,把*this和rhs中的p所指向的空間都刪除了。
做如下修改:
a& a::operator =(const a& rhs)
該方法也會產生問題,如果new過程發生錯誤,則p所指向的空間已經被刪除了,也會產生問題。
再做如下的修改:
a& a::operator =(const a& rhs)
Effective C 學習心得 續2
12 當過載某個符號需要返回object時,注意下面兩種寫法的差異 這種方法是錯誤的。因為a是區域性變數。const a operator const a aa,const a bb 這種方法是正確的 const a operator const a aa,const a bb return a 1...
學習心得 python學習心得
自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...
學習心得 我的學習心得
我是乙個已經步入中年的70後,離開校園已經20年了,因為當年的政策因素而未能圓我的大學夢,在20年的工作過程中總是因為缺少一張大學文憑而失去了很多機會,曾經也考慮過自考,但是乙個人去面對的時候總感覺心有餘而力不足。2018年3月份偶然讓我認識了尚德,原來自考還可以這樣學習。一直懷疑自己年紀大了記憶力...