天天看點

c++基礎(上) 聽課流水賬

1、pass by value /   pass  by  pointer  /   pass  by  reference

pass by value:實參和形參不是同一個值,是以交換的是形參的值,當函數swap結束後,a和b的值并沒有發生交換

pass  by pointer  and  pass by reference :實參和形參是相同的。

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

2、動态記憶體

申請失敗的傳回值是 0  而不是 NULL, null在cpp中廢止了。

c++基礎(上) 聽課流水賬

申請一個長度我10,初始值都為0的空間

int *num= new int[10]();           

3、對比new和malloc

c++基礎(上) 聽課流水賬

4、cpp記憶體模型

記憶體模型:棧、堆、靜态區、常量區。

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

5、數組記憶體模型

c++基礎(上) 聽課流水賬

5、const char *    /   char *  const    /   char const *

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

在c中,const是隻讀變量,cpp裡const指的是常量。

c++基礎(上) 聽課流水賬

6、常量指針和指針常量

下圖為p1常量指針——p1所指位址上的内容不可以通過p1做出改動

c++基礎(上) 聽課流水賬

下圖p2為指針常量——p2所指的位址不可以發生改動

數組名就是一個指針常量

c++基礎(上) 聽課流水賬

執行個體:

c++基礎(上) 聽課流水賬

下圖中的int const* pi和const int* pci是一樣的

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

7、UML類圖

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

一些編碼規範:類名首字母大寫;

c++基礎(上) 聽課流水賬

8、匿名對象

c++基礎(上) 聽課流水賬

9、通路對象成員

傳回值類型  類名 : :  函數名

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

10、cpp的string類型

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

11、通路器與更改器

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

12、同名屏蔽

c++基礎(上) 聽課流水賬
#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指針

c++基礎(上) 聽課流水賬

14、避免同名屏蔽的簡單方法

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

15、對象數組

c++基礎(上) 聽課流水賬
#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、封裝

c++基礎(上) 聽課流水賬

當你的資料域是對象類型的時候,他必須放在構造函數的初始化清單裡面進行建構,除非這個資料域的對象類型中有預設的無參構造函數。

c++基礎(上) 聽課流水賬

17、不可變對象

定義:建立之後,不可變對象不可修改,除非通過成員拷貝。

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

如何讓類“不可改變”:

1、資料域均設定為私有屬性。

2、沒有接口,使得外部可以調用來更改你的資料。

3、也沒有能夠傳回可變資料域對象的引用或指針的通路器。

c++基礎(上) 聽課流水賬

不可變類的一個特征是線程安全的,是以他有用。

18、避免多次聲明

c++基礎(上) 聽課流水賬

19、static

本檔案内的static函數隻允許本檔案通路

c++基礎(上) 聽課流水賬

下圖中的靜态資料成員numberofObjects,被類Circle的對象們共享。

c++基礎(上) 聽課流水賬

靜态成員變量隻能放在所有函數的外面進行初始化

c++基礎(上) 聽課流水賬

numberOfObjects一定要初始化,不然會報錯

20、使用靜态成員函數的規則

靜态成員函數的通路規則

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

21、析構函數

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

22、拷貝構造

拷貝構造函數的形式以及何時會調用拷貝構造函數

注意下圖右下角的指派  x c = b; ,構造出的c裡面傳入的是預設參數 1 。

c++基礎(上) 聽課流水賬

淺拷貝和深拷貝(類中資料成員如果含有指針,一定要自己寫拷貝構造函數,因為編譯器預設給生成的是淺拷貝版的拷貝構造函數,容易出問題的)

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

拷貝構造函數是一種特殊的構造函數

23、寫一個類,實作棧的功能

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

24、寫一個類,實作vector

c++基礎(上) 聽課流水賬

24、一些編碼規範

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

25、繼承

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

派生類不能繼承的是:

1、構造函數(cpp 11 中已經允許)

2、析構函數

3、友元函數

4、拷貝指派函數

c++基礎(上) 聽課流水賬

派生類構造函數調用基類構造函數的方法 :

c++基礎(上) 聽課流水賬

若沒有顯示的調用基類的構造函數,則編譯器預設調用無參的基類構造函數

(如果你寫的構造函數有參,則編譯器會報錯,因為找不到無參的積累構造函數)

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

構造和析構的順序

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

26、重定義

派生類對父類的同名函數内容進行修改。不修改的地方:

1、傳回值類型

2、傳入的參數

3、函數名

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

區分重定義和重載

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

27、綁定

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

基類中定義的虛函數,在派生類中的同名函數會自動變成虛函數,無需添加virtual關鍵字。

c++基礎(上) 聽課流水賬

總結靜态綁定和動态綁定

c++基礎(上) 聽課流水賬

下面四張圖的總結:

通路方式 通路對象
對象調用(p.f()) 子類同名函數
父類指針指向子類對象(圖2) 父類同名函數
父類指針指向子類對象(圖3) 子類的同名虛函數
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

28、protected

c++基礎(上) 聽課流水賬

protected成員可以被類内成員函數直接擷取,不可以通過對象來擷取。

c++基礎(上) 聽課流水賬

29、幾種繼承方式的總結

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

30、抽象類與純虛函數

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

抽象類(有純虛函數的類是抽象類)不能被執行個體化

31、動态轉換

c++基礎(上) 聽課流水賬
c++基礎(上) 聽課流水賬

32、向上轉型和向下轉型

c++基礎(上) 聽課流水賬

向上轉型可不使用dynamic_cast,而是隐式轉換

向下轉型必須使用dynamic_cast進行顯示轉換。

c++基礎(上) 聽課流水賬

33、typeid運算符——用于擷取對象所屬的類的資訊

c++基礎(上) 聽課流水賬

可将派生類對象截取,隻是用繼承來的資訊;但是不能将基類對象加長,無中生有變出派生類對象。(如下圖:circle是派生類)

c++基礎(上) 聽課流水賬

繼續閱讀