1.公有成員
類可以訪問,
類物件可以訪問,
通過公有繼承的派生類可以訪問,
通過私有繼承的派生類可以訪問,
通過保護繼承的派生類可以訪問,
通過公有繼承的派生類的物件可以訪問,
通過私有繼承的派生類的物件不可以訪問,
通過保護繼承的派生類的物件不可以訪問。
2.私有成員
類可以訪問,
類物件不可以訪問,
通過公有繼承的派生類不可以訪問,
通過私有繼承的派生類不可以訪問,
通過保護繼承的派生類不可以訪問,
通過公有繼承的派生類的物件不可以訪問,
通過私有繼承的派生類的物件不可以訪問,
通過保護繼承的派生類的物件不可以訪問。
3.保護成員
類可以訪問,
類物件不可以訪問,
通過公有繼承的派生類可以訪問,
通過私有繼承的派生類可以訪問,
通過保護繼承的派生類可以訪問,
通過公有繼承的派生類的物件不可以訪問,
通過私有繼承的派生類的物件不可以訪問,
通過保護繼承的派生類的物件不可以訪問。
8.函式過載分析(下)
注意:函式過載必然發生在同乙個作用域;
編譯器需要用"引數列表"或"函式型別"進行函式選擇
無法直接通過函式名得到過載函式的入口位址,必須借助於函式指標進行強制型別轉換
extern關鍵字能強制讓c++編譯器進行c方式的編譯
c++編譯器的內建巨集 __cplusplus
c++編譯器不能以c的方式編譯過載函式
9.new關鍵字與命名空間
new關鍵字與malloc函式的區別:
new關鍵字是c++的一部分;而malloc函式是c庫提供的函式。
new以型別為單位,且可以完成初始化;而malloc函式以位元組為單位,不可以完成初始化。
c語言共享乙個全域性域
c++ 可以命名域空間
10.新型型別轉換
static_cast:用於基本型別轉換,不能用於基本型別指標轉換,用於有繼承關係類物件之間的轉換和類指標的轉換
const_cast:去除變數的唯讀屬性,強制轉換的目標型別必須是指標或引用
dynamic_cast:用於有繼承關係的類指標之間的轉換,用於有交叉關係的類指標間的轉換,具有型別檢查功能,需要虛函式的支援
reinterpret_cast:用於指標型別之間的強制型別轉換,用於整數和指標之間的轉換
****const關鍵字
只有用字面量初始化的const常量才會進入符號表
使用其他變數初始化的const常量依舊是唯讀變數
被volalite修飾的const常量不會進入符號表
//編譯期間編譯器不能確定初始值的const關鍵字,只會當作唯讀變數
const修飾物件為唯讀物件
使用引用初始化另乙個引用,如果型別不一致,會分配乙個新的記憶體空間
例如:char c = 『c』;
char& rc = c;
const int & trc = c;
rc和c有相同的記憶體空間,而trc會另外分配記憶體空間
c++提供兩種特殊函式:
1.預設無參建構函式(類定義是沒有提供建構函式(包括拷貝建構函式))
2.預設拷貝建構函式(淺拷貝,類定義沒有提供拷貝建構函式)
c++初始化列表
1.初始化類的const成員變數,在建構函式的定義之後函式體之前寫初始化列表;
2.成員的初始化的順序依賴於成員的成名順序;(***)
3.初始化列表先於建構函式的函式體執行;
4.類中的const成員變數,是唯讀變數;因為編譯器無法獲取其初始值,將其記入符號表;
物件的構造順序
c++中全域性物件的構造順序是不確定的,隨編譯器而定;
析構函式
一般當類中定義了建構函式,並且函式中使用了系統資源,需要自定義析構函式;
臨時物件:(要盡量避免臨時物件的產生)
直接呼叫建構函式將產生乙個臨時物件,生命週期只有一條語句
例子:class a = class(a); 臨時物件初始化物件時,不會呼叫拷貝建構函式,會直接由構造臨時物件賦給a,省略了拷貝建構函式,替身了效率;
所有的物件共享類的成員函式,在類的成員函式中,有乙個隱藏指標this表示當前物件
靜態成員變數在初始化時,需要完整的定義加初始化,例如: int class::a = value;
靜態成員函式在被物件或類名呼叫時,可以直接訪問靜態成員變數,但不可以直接訪問成員變數,需要借助於物件作為引數傳入間接訪問
靜態成員函式和普通成員函式的區別:
所有物件共享 yes yes
隱含this指標 no yes
直接訪問普通成員變數(函式) no yes //建構函式為特殊函式
直接訪問靜態成員變數(函式) yes yes
通過類名呼叫 yes no
通過物件呼叫 yes yes
建構函式裡面可以執行return語句,當執行到return語句時會直接返回;
建構函式只提供了初始化成員變數等一系列操作,並不能保證初始化邏輯一定成功,可能被return返回;
採用二階構造可以有效避免半成品物件。
友元指的是函式與類或者類與類之間的關係,是單向的;
友元可以直接訪問類的所有成員,不受到類中訪問級別的限制;
過載函式本質為不同的函式
函式名和引數列表是唯一的標識
函式過載必須發生在同乙個作用域內
類的靜態成員函式和普通成員函式可以構成過載
類的成員函式為操作符過載函式比全域性操作符過載函式少乙個左運算元;
編譯器有現在類的成員函式中尋找操作符過載函式
賦值操作符(=,[ ],( ),->,*)只能在成員函式內實現操作符過載,且返回值為當前物件(return *this)
操作符過載不能改變原操作符的優先順序
操作符過載不能改變運算元的個數
操作符過載不能改變原有的語義
c++標準庫有乙個相容了c語言庫的子庫
c++標準庫位於std命名空間
sstream標頭檔案,解決字串和浮點型的轉換
istringstream物件將字串轉為浮點數,例如 istingtream iss(「1212.12」); double num; iss>>num; 「>>「操作符返回型別為bool
ostringstream物件將浮點數轉為字串,例如 ostringsteam oss; oss<<121.11;(等價於oss << 121 <<」.」 <<11;) string str = oss.str(); "<<"操作符返回型別為oss;
函式物件:過載()操作符;函式物件用於在工程中取代指標 //智慧型指標
不要使用c語言中操作字串的方式寫c++**
c++過載邏輯運算子(&& 和||)短路法則完全失效,過載無法實現原生的原有語義,工程裡不建議過載邏輯操作符,可以過載比較操作符或者使用成員函式代替邏輯操作符;使用全域性函式對邏輯操作符過載
c++過載逗號操作符是合法的;在全域性函式中對逗號操作符進行過載;過載函式的引數必須有乙個是類型別,過載函式的返回值必須是引用;過載之後原生語義會改變,從左到右的順序會不確定了,類似於邏輯運算子過載
++/–操作符都可以通過全域性函式和成員函式過載
過載前置操作符不需要額外引數;
過載後置操作符需要乙個int型佔位符;
轉換建構函式:1.只有乙個引數的建構函式,可以隱式呼叫建構函式轉換引數型別為類物件,在工程中需要避免隱式呼叫
類中定義型別轉換函式可以完整型別之間的隱式轉換,例如:operator int(){}
型別轉換函式和轉換建構函式兩者可能相互衝突
子類物件呼叫父類建構函式隱式呼叫為無參建構函式,顯示呼叫建構函式需要採用初始化列表
父子關係
父類物件可以被子類賦值;
父類物件可以被子類初始化;
父類指標可以指向子類;
父類引用可以被子類初始化;
父類指標或引用訪問子類物件時,會完全退化為父類物件
函式重寫必須多型實現,否則沒有意義
多繼承不利於大專案的開發
工程中實現多繼承的方式為單繼承加多介面的方式實現
子類呼叫父類的成員函式,且該父類成員函式呼叫帶virtual關鍵字的成員函式,會產生怎麼樣的呼叫?
dynamic_cast與繼承相關的型別轉換關鍵字,要求相關類中必須有虛函式;
dynamic_cast用於有直接或間接繼承關係的指標或引用之間;
函式模板可以由編譯器自動推導,編譯器對函式模板進行兩次編譯:1.對模板**本身進行編譯;2.對引數替換後的**進行替換
編譯器無法自動推導函式模板的返回值型別,可以從左到右部分指定型別引數
當函式模板遇到過載,編譯器會優先考慮普通函式,後生成最優的函式型別
函式模板只有完全特化
函式模板使用數值型別作為模板引數,在具體呼叫時不能為變數,浮點數和物件
類模板需要顯示指定呼叫
類模板有部分特化和完全特化
單例模式:
1.將建構函式的訪問屬性設定為private;
2.定義instance指標初始化為null
3.需要使用物件是,通過靜態成員函式建立物件並使用instance標記
c語言處理異常的方式:setjmp和longjmp聯合使用
變參函式呼叫物件時會造成程式的崩潰
建構函式丟擲異常:
1.構造過程立即停止
2.當前物件無法生成
3.析構函式不會被呼叫
4.物件所占用的空間立即收回
析構函式異常將導致所使用的資源無法完全釋放
建構函式和析構函式呼叫成員函式不會產生多型呼叫
只能在堆上生成物件:將析構函式設定為私有。
原因:c++是靜態繫結語言,編譯器管理棧上物件的生命週期,編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性。若析構函式不可訪問,則不能在棧上建立物件。
C 學習小結
一,帶有預設引數的函式 c 允許實參個數與形參個數不同,方法是在說明函式原型時,為乙個或多個形參制定預設值,當進行函式呼叫時,編譯系統按從左向右順序將實參與形參結合,若未指定足夠的實參,則編譯系統按順序用函式原型中的形參預設值來補足所缺少的實參。且在宣告函式時,所有指定預設值的引數都必須出現在不指定...
C 學習記錄
由於之前寫c c 程式時,動不動就容易報錯,也就沒繼續用,一直覺得c 很難。最近在學習機器學習時,用到了乙個c 神經網路庫,並且在菜鳥教程中看到了c 的教程,於是學了一下,發現根本沒有想象中的那麼難,可能也是這個教程講的比較好吧。現在把一些學到的比較重要的點記錄一下吧!1.ifndef 突然覺得在標...
C 學習記錄
原創 主要是c 和c 不同的地方,會寫一下,流程控制什麼的都差不多,比較適合c 轉c 的人看 以前沒有系統的學過c 現在補一下,以前完全是為了看懂別人的 稍微看一下,也沒有太想在這方面下功夫,學一點是一點,目標是能修改別人的c 服務端程式。一.包含 包含原理上什麼檔案都能包含進來,但是一般只包含.c...