国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++類中需要注意的地方

2019-11-08 02:03:27
字體:
來源:轉載
供稿:網友

Talk is cheap, show me the code.

類的靜態成員函數不允許聲明為const,否則編譯會報錯。當類的非靜態成員函數被聲明為const, 表明這個非靜態成員函數隱含傳入的this指針為const指針,即指針指向的對象為常量, 在函數內部不允許對類的成員變量進行賦值,否則會報錯,并且在類外部實現該非靜態成員函數時也需要加上const聲明,否則編譯也會報錯。

類class不加修飾符時默認是PRivate的,結構體struct不加修飾符默認是public的。

關于const和非const變量或對象之間是否能直接賦值的問題。const和非const變量之間時可以直接相互賦值的,因為賦值只是將變量值進行一次拷貝,但是如果是指針變量的話就需要注意: 不能將const char*變量賦值給char*,雖然賦值的只是對象地址,但是可能會導致指針指向的對象值的改變;可以將char* const 變量賦值給char*,因為char* const是指向變量的常量指針,賦值只是將指針地址進行拷貝,作用等同于將const int 賦值給int。

std中定義的pair的使用方法:pair是定義在標準庫中的一個結構體,有兩個成員變量first和second,是對兩種類型的一個簡單封裝,構建pair的方式有兩種,一種是直接使用構造函數:

pair<string, int> p1("lee", 2);

另一種是采用標準庫中定義的函數make_pair:

pair<string, int> p2 = make_pair("www", 3);

構造函數不可以聲明為const;構造函數可以使用初始化列表進行成員變量初始化: Constructor():member1(val1), member2(val2){};初始化列表中變量初始化的順序只和類成員變量定義的次序有關,和初始化列表中出現的次序無關。

對于沒有構造函數的類類型成員,const成員或引用類型成員, 必須在構造函數的初始化列表中進行初始化,在構造函數體內進行賦值初始化是無效的。

int i = 1; const int i1 = i; int &i2 = i; 這些都是正確的,但是為什么在構造函數中不能通過在函數體內賦值進行初始化,而必須在初始化列表中初始化呢?這是因為構造函數執行時分兩個階段,一個階段是進行初始化階段,初始化列表就是在初始化階段執行的;另一個階段是普通的計算階段,當進入構造函數體內時其實初始化階段已經結束,進入了普通計算階段。如果只是通過在函數體內對const或引用類型成員賦值,這些成員其實在初始化階段已經被默認初始化成了不確定的值,這里再進行賦值就會出錯,編譯不通過。

explicit關鍵字只用于類的內部用來修飾構造函數的聲明,構造函數如果再類外部定義無需加上explicit關鍵詞,否則會報錯。explicit關鍵字的作用是不允許隱式轉換。

對于非浮點型數據類型可以直接類內部初始化靜態常量,但是浮點型就不能直接在類內部初始化靜態常量。靜態變量都不可以在類內部進行初始化。

class Test1 { public: static int a = 1; //error static const int b = 1; //right static const double c = 1.2; //error }; int Test1::a = 1; //right int Test1::c = 1.2; //right

一般來說,最好顯示或隱式定義默認構造函數和復制構造函數。只有不存在其他構造函數時才合成默認構造函數。如果定義了復制構造函數,也必須定義默認構造函數。沒有復制構造函數將會嚴重限制類的使用,對象只能采用引用的方式作為函數參數或者返回類型,并且不能作為容器的元素。 對于帶有指針類型的類尤其需要注意,需要自己定義復制構造函數,因為編譯器自動合成的復制構造函數將會是賦值指針,而不是賦值指針指向的對象。復制構造函數的形參通產都是const引用類型的,引用類型是必須的,const不一定是必須,但是最好帶上。

通常需要自己定義析構函數,那么也需要自己定義復制構造函數和重載賦值操作符,這被稱為復制控制三原則。編譯器自動合成的析構函數不會自動釋放指針資源,必須自己手動刪除。析構函數中撤銷數組資源時會逐個撤銷數組中每個元素資源,并且是按照從后往前逆序撤銷。

類中涉及到動態分配資源或者涉及到指針,一般都是需要自己定義復制控制函數(復制構造函數,重載賦值操作符,析構函數)的,因為動態分配的資源析構函數不會自動回收,包含指針時默認合成的復制構造函數和賦值操作符都是只復制指針值,而沒有復制指針指向的對象,這樣容易出現垂懸指針。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 郁南县| 和林格尔县| 墨玉县| 德惠市| 乐陵市| 四子王旗| 休宁县| 高台县| 凭祥市| 南宫市| 镇康县| 衡阳县| 淅川县| 邵阳市| 阿荣旗| 上杭县| 昂仁县| 高邮市| 淮北市| 辽阳市| 耿马| 仁布县| 永和县| 玉溪市| 朝阳市| 调兵山市| 仙桃市| 珠海市| 南靖县| 普兰县| 万山特区| 昌都县| 谢通门县| 高要市| 丹江口市| 柳林县| 高尔夫| 灵丘县| 永安市| 孟津县| 株洲市|