c++基础(上) 听课流水账
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),然后調用賦值運算符將該匿名對象賦值給c9return 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是派生類)
總結
以上是生活随笔為你收集整理的c++基础(上) 听课流水账的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dart中的mixins
- 下一篇: C++之Boost准标准库配置