C++類和對象總結
1.函數重載的條件:
a. 同一作用域
b. 參數名相同
c. 形參列表(參數個數,類型,順序)不同
2.函數調用約定
a. _cdecl
b. _stdcall
c. _thiscall
3.引用
1). 概念:引用不是定義一個變量,而是給已存在的變量取了一個別名,編譯器不會爲引用變量開闢內存空間,它和它引用的變量共用 同一塊內存空間
2). 用法: 類型& 引用變量名(對象名) = 引用實體
3). 引用特性:
a. 引用在定義時必須初始化;
b. 一個變量可以有多個引用;
c. 引用一旦引用一個實體,再不能引用其他實體;
4. 引用的使用場景
a. 作爲函數參數 ;
b. 作爲函數的返回值 ps:不能返回棧空間上的引用;
5. 引用和指針的區別
相同點:底層的實現方式相同,都是按照指針的方式來實現的(引用在底層就是一個指針,相當於指針常量, 即&相當於 * const);
不同點:
1). 引用在定義時必須初始化,指針沒有要求
2). 一旦一個引用被初始化爲指向一個對象,就不能在指向其他對象,指針
可以在任何時候指向任何一個對象
3). 沒有NULL引用,但有NULL指針
4). 在sizeof中含義不同:引用結果爲引用類型的大小,但指針始終是地址
空間所佔字節個數
5). 引用自加改變變量的內容,指針自加改變指針指向
6). 有多級指針,但是沒有多級引用
7). 指針需要手動尋址,引用通過編譯器實現尋址
8). 引用比指針用起來嫌貴安全
4.命名空間
在C++中,變量、函數和類都是大量存在的,這些變量、函數和類的名稱將都存在於全局命名空間中,會導致很多衝突, 使用命名空間的目的是對標識符的名稱進行本地化,以避免命名衝突或名字污染,namespace關鍵字的出現就是針對這種問題的。
1). 命名空間的定義
namespace N1 //N1爲命名空間的名稱
{
void test();//命名空間中的內容,既可以是定義變量,也可以是定義函數
}
//命名空間可以嵌套
//同一工程中允許存在多個相同名稱的命名空間,編譯器最後會合成同一個命名空間
說明:
(1).一個命名空間就定義了一個新的作用域,命名空間中的所有內容都侷限於該命名空間;
(2).沒有名稱的命名空間,他的成員只在聲明該命名空間的文件中可以訪問,訪問時不需要加命名空間名稱,對於其他命名空間中內容不可見;
2. 命名空間的使用方法
(1).NI::test();
(2).using N1::test();
(3).suing namespace N1;
5.類
1).類中的數據稱爲類的屬性或者類的成員變量,類中的函數稱爲類的方法或者類的成員函數;
2).C++的三大特性:封裝,繼承,多態;
3).封裝: 隱藏對象的屬性和實現細節,僅對外公開接口和對象進項交互,將數據和操作數據的方法進行有機結合。
(1).public成員在類外可以直接訪問;
(2).protected和private成員在類外不能夠訪問;
(3).他們的作用域從訪問限定符出現的位置開始直到下一個訪問限制符出現爲止;
(4).class的默認訪問權限是private,而struct爲public型(因爲要兼容C);
ps:訪問限定符只在編譯時有用,當數據映射到內存後,沒有任何訪問限定符上的區別。
4).一個類的大小,實際就是該類中成員變量之和,空類的大小爲1字節(視現實而定)
6.this指針
1).類的成員函數有一個隱藏的指針,指向了調用該函數的對象本身。
2).this指針特性
(1).this指針的類型: 類類型* const;
(2).this指針並不是對象本身的一部分,不影響sizeof的結果;
(3).this的作用域在類“成員函數”的內部;
(4).this指針是“類成員函數”的第一個默認隱含參數,編譯器自動維護傳遞類編寫者不能顯示傳遞;
(5).只有在類的非靜態成員函數中才可以使用this指針,其他任何函數都不可以 ;
7.類6個默認的成員函數
1).構造函數;
2).拷貝構造函數;
3).析構函數;
4).賦值操作符重載;
5).取地址操作符重載;
6).const修飾的取地址操作符重載;
8.構造函數
1).概念:構造函數是一個特殊的成員函數,名字與類名相同,創建類類型對象時由編譯器自動調用,在對象的生命週期內只能調用一次,保證每個數據成員都有一個合適的初值
2).構造函數的特性
(1).函數名於類名相同;
(2).沒有返回值;
(3).新對象被創建是,由編譯器自動調用,且在對象聲明週期內僅調用一次;
(4).構造函數可以重載,實參決定刻調用那個構造函數;
(5).無參構造函數和帶有缺省的構造函數都認爲是缺省的構造函數,並且缺省的構造函數只能有一個;
(6).有初始化列表(可以不用);
(7).如果沒有顯示定義時,編譯器會合成一個默認的構造函數;
(8).構造函數不能用const修飾;
(9).構造函數不能爲虛函數 ;
3).類中包含以下成員,一定要放在初始化列表位置進行初始化:
引用成員函數;
const成員變量;
類類型成員(該類有費缺省的構造函數);
4).構造函數的作用
(1).構造 初始化對象;
(2).類型轉換;
對於單個參數構造函數,可以將其接受參數轉化成類類型的對象。用explicit修飾構造函數,抑制由構造函數定義的隱式轉換,explicit關鍵字類內部的構造聲明上,在類的定義體外部的定義不在重複。
9. 拷貝構造函數
1).概念:只有單個形參,而且該形參是對本類類型對象的引用(常用const修飾),這樣的構造函數稱爲拷貝構造函數。拷貝構造函數是特殊的構造函數,創建對象時使用已存在的同類對象來進行初始化,由編譯器自動調用
2).特徵:
(1).構造函數的性質拷貝構造函數均滿足;
(2).參數必須使用類類型對象的引用傳遞;
(3).如果沒有顯示定義,系統會自動合成一個默認的拷貝構造函數。默認的拷貝構造函數會依次拷貝類的數據成員完成初始化。
3).使用場景
(1).對象實例化對象;
(2).作爲函數參數;
(3).作爲函數返回值;
10.析構函數
1).概念:與構造函數功能相反,在對象被銷燬時,由編譯器調用,完成類的一些資源清理工作和汕尾工作。
2).特性:
(1).析構函數在類名加上字符~;
(2).析構函數無參數無返回值;
(3).一個類有且只有一個析構函數。若未顯示系統會自動生成缺省的析構函數;
(4). 對象聲明週期結束,C++編譯器系統自動調用析構函數;
(5). 注意析構函數體內並不是刪除對象,而是做清理工作;
11.友元
友元分爲:友元函數和友元類。
1).友元函數:可以直接訪問累的私有成員,他是定義在累外部的普通函數,不屬於任何類,但需要在類的內部聲明,聲明時需要加上friend關鍵字。
2).友元函數特性:
(1).友元函數可訪問類的私有成員,但不是類的成員函數;
(2).友元函數不能用const修飾;
(3).友元函數可以在類定義的任何地方聲明,不受訪問限定符限制;
(4).一個函數可以是多個類的友元函數;
(5).友元函數的調用於普通函數的調用和原理相同;
3).友元類
友元類的所有成員函數都可以另外一個類的友元函數,都可以訪問另一個類中的非公有成員。
4).優缺點
優點:提高了程序運行效率;
缺點:破壞了類的封裝性和隱藏性;
5)注意:
(1).友元關係不能繼承;
(2).友元關係是單向的,不具有交換性;
(3).友元關係不能傳遞;
12.運算符重載
1).概念:重載操作符是具有特殊函數名的函數,關鍵字operator後面接需要定義的操作符符號。操作符重載也是一個函數,具有返回值和形參表。它的形參數目與操作符的操作數目相同,使用運算符重載可以提高代碼的可讀性返回值 operator 操作符(參數列表)。
2).特性:
(1).不能通過連接其他符號來創建新的操作符:比如operator@;
(2).重載操作符必須有一個類類型或者枚舉類型的操作數;
(3).用於內置類型的操作符,其含義不能改變,例如:內置的整型+,不能改變其含義;
(4).作爲類成員的重載函數,其形參看起來比操作數數目少1成員函數的操作符有一個默認的形參this,限定爲第一個形參;
(5).一般將算術操作符定義爲非成員函數,將賦值運算符定義成員函數;
(6).操作符定義爲非類的成員函數時,一般將其定義爲類的友元;
(7).== 和 != 操作符一般要成對重載;
(8).下標操作符[]:一個非const成員並返回引用,一個是const成員並返回引用;
(9).解引用操作符*和->操作符,不顯示任何參數;
(10).前置式++/–必須返回被增量或者減量的引用,後綴式操作符必須返 回舊值,並且應該是值返回而不是引用返回;
(11).輸入操作符>>和輸出操作符<<必須定義爲類的友元函數;
參考博文:1、C++類和對象知識點總結