1、pass by value / pass by pointer / pass by reference
pass by value:實參和形參不是同一個值,是以交換的是形參的值,當函數swap結束後,a和b的值并沒有發生交換
pass by pointer and pass by reference :實參和形參是相同的。
2、動态記憶體
申請失敗的傳回值是 0 而不是 NULL, null在cpp中廢止了。
申請一個長度我10,初始值都為0的空間
int *num= new int[10]();
3、對比new和malloc
4、cpp記憶體模型
記憶體模型:棧、堆、靜态區、常量區。
5、數組記憶體模型
5、const char * / char * const / char const *
在c中,const是隻讀變量,cpp裡const指的是常量。
6、常量指針和指針常量
下圖為p1常量指針——p1所指位址上的内容不可以通過p1做出改動
下圖p2為指針常量——p2所指的位址不可以發生改動
數組名就是一個指針常量
執行個體:
下圖中的int const* pi和const int* pci是一樣的
7、UML類圖
一些編碼規範:類名首字母大寫;
8、匿名對象
9、通路對象成員
傳回值類型 類名 : : 函數名
10、cpp的string類型
11、通路器與更改器
12、同名屏蔽
#include "pch.h"
#include<iostream>
using namespace std;
class Foo {
public:
int x;
int y;
Foo() {
x = 10;
y = 10;
}
void p() {
int x = 20;
cout << x << endl;
cout << y << endl;
}
};
int main(int argc, char **argv)
{
Foo foo;
foo.p();
return 0;
}
運作結果: 20 10
13、成員函數的this指針
14、避免同名屏蔽的簡單方法
15、對象數組
#include "pch.h"
#include <iostream>
using namespace std;
class C {
public:
C(int i) { //帶參構造函數
std::cout << "\t parameterized ctor" << std::endl;
}
C() { //無參(預設)構造函數
std::cout << "\t default ctor" << std::endl;
}
C(const C& c) { //拷貝構造函數
std::cout << "\t copy ctor" << std::endl;
}
C& operator =(const C& c) { //重載了類C的指派運算符,觀察main()中的對象指派現象
std::cout << "\t assignment operator" << std::endl;
return *this;
}
};
int main() {
cout << "C c1;" << endl;
C c1; //調用無參(預設)構造函數
cout << "C c2(2);" << endl;
C c2(2); //調用有參構造函數
cout << "C c3 = c1;" << endl;
C c3 = c1; //調用拷貝構造函數
cout << "C c4 = C();" << endl;
C c4 = C(); //編譯器将之等價為 C c4;
cout << "C c5 = C(5);" << endl;
C c5 = C(5); //編譯器将之等價為 C c5(5);
cout << "C c6(c1);" << endl;
C c6(c1); //調用拷貝構造函數
cout << "C c7(C(7));" << endl;
C c7(C(7)); //編譯器将之等價為 C c7(7);
cout << "C c8[4] = {C(), C(18), c7};" << endl;
C c8[4] = { C(), C(18), c7 }; //c8中的4個元素初始化時,是看做4個獨立的對象處理:
//C c80 = C(); 調預設構造函數
//C c81 = C(18); 調有參構造函數
//C c82 = c7; 調拷貝構造函數
//C c83 = C(); 調預設構造函數
cout << "C c9; c9 = C(9);" << endl;
C c9; //調用預設構造函數
c9 = C(9); //先調用有參構造函數構造一個匿名對象C(9),然後調用指派運算符将該匿名對象指派給c9
return 0;
}
16、封裝
當你的資料域是對象類型的時候,他必須放在構造函數的初始化清單裡面進行建構,除非這個資料域的對象類型中有預設的無參構造函數。
17、不可變對象
定義:建立之後,不可變對象不可修改,除非通過成員拷貝。
如何讓類“不可改變”:
1、資料域均設定為私有屬性。
2、沒有接口,使得外部可以調用來更改你的資料。
3、也沒有能夠傳回可變資料域對象的引用或指針的通路器。
不可變類的一個特征是線程安全的,是以他有用。
18、避免多次聲明
19、static
本檔案内的static函數隻允許本檔案通路
下圖中的靜态資料成員numberofObjects,被類Circle的對象們共享。
靜态成員變量隻能放在所有函數的外面進行初始化
numberOfObjects一定要初始化,不然會報錯
20、使用靜态成員函數的規則
靜态成員函數的通路規則
21、析構函數
22、拷貝構造
拷貝構造函數的形式以及何時會調用拷貝構造函數
注意下圖右下角的指派 x c = b; ,構造出的c裡面傳入的是預設參數 1 。
淺拷貝和深拷貝(類中資料成員如果含有指針,一定要自己寫拷貝構造函數,因為編譯器預設給生成的是淺拷貝版的拷貝構造函數,容易出問題的)
拷貝構造函數是一種特殊的構造函數
23、寫一個類,實作棧的功能
24、寫一個類,實作vector
24、一些編碼規範
25、繼承
派生類不能繼承的是:
1、構造函數(cpp 11 中已經允許)
2、析構函數
3、友元函數
4、拷貝指派函數
派生類構造函數調用基類構造函數的方法 :
若沒有顯示的調用基類的構造函數,則編譯器預設調用無參的基類構造函數
(如果你寫的構造函數有參,則編譯器會報錯,因為找不到無參的積累構造函數)
構造和析構的順序
26、重定義
派生類對父類的同名函數内容進行修改。不修改的地方:
1、傳回值類型
2、傳入的參數
3、函數名
區分重定義和重載
27、綁定
基類中定義的虛函數,在派生類中的同名函數會自動變成虛函數,無需添加virtual關鍵字。
總結靜态綁定和動态綁定
下面四張圖的總結:
通路方式 | 通路對象 |
對象調用(p.f()) | 子類同名函數 |
父類指針指向子類對象(圖2) | 父類同名函數 |
父類指針指向子類對象(圖3) | 子類的同名虛函數 |
28、protected
protected成員可以被類内成員函數直接擷取,不可以通過對象來擷取。
29、幾種繼承方式的總結
30、抽象類與純虛函數
抽象類(有純虛函數的類是抽象類)不能被執行個體化
31、動态轉換
32、向上轉型和向下轉型
向上轉型可不使用dynamic_cast,而是隐式轉換
向下轉型必須使用dynamic_cast進行顯示轉換。
33、typeid運算符——用于擷取對象所屬的類的資訊
可将派生類對象截取,隻是用繼承來的資訊;但是不能将基類對象加長,無中生有變出派生類對象。(如下圖:circle是派生類)