Effective C 學習心得

2021-05-26 15:15:29 字數 2238 閱讀 5815

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月份偶然讓我認識了尚德,原來自考還可以這樣學習。一直懷疑自己年紀大了記憶力...