C 自學 《北京大學精品課》筆記

2022-09-20 05:12:11 字數 3933 閱讀 7513

1、引用

(1)某個變數的引用,等價於這個變數,相當於該變數的乙個別名

(2)定義引用時一定要將其初始化成引用某個變數

(3)初始化後,它就一直引用該變數,不會再引用別的變數了

(4)引用只能引用變數,不能引用常量和表示式

(5)常引用:定義引用時,前面加const關鍵字,即為「常引用」

(6)不能通過常引用去修改其引用的內容

2、const關鍵字

(1)不可通過常量指標修改其指向的內容

(2)不能把常量指標賦值給非常量指標,反過來可以

(3)函式引數為常量指標時,可避免函式內部不小心改變引數指標所指地方的內容

(4)不能通過常引用修改其引用的變數

3、動態記憶體分配

new運算子:

(1)第一種用法,分配乙個變數: p = new t (t是任意變數名,p是型別為t *的指標)

(2)第二種用法,分配乙個陣列: p = new t[n] (t是任意變數名,p是型別為t *的指標,n是要分配的陣列元素的個數,可以是整型表示式)

(3)new運算子的返回值型別是 t *

delete運算子:

(1)用new動態分配的記憶體空間,一定要用delete運算子進行釋放: delete 指標,一片空間不能被delete多次

(2)用delete釋放動態分配的陣列,要加:delete指標 // 該指標必須指向new出來的陣列

4、內聯函式

(1)在函式定義前面加「inline」關鍵字,即可定義內聯函式

5、函式過載

(1)乙個或多個函式,名字相同,然而引數個數或引數型別不相同,這叫做函式的過載

(2)編譯器根據呼叫語句中的實參的個數和型別判斷應該呼叫哪個函式

6、函式的預設引數

(1)c++中,定義函式的時候可以讓最右邊的連續若干個引數有預設值,那麼呼叫函式的時候,若相應位置不寫引數,引數就是預設值

void func(int x1, int x2 = 2, int x3 = 3

) func(

10); //

等效於func(10, 2, 3)

func(10,8); //

等效於func(10, 8, 3)

func(10, ,8); //

不行,只能最右邊的連續若干個引數預設

(2)函式引數可預設的目的在於提高程式的可擴充性,即如果某個寫好的函式要新增新的引數,而原先那些呼叫該函式的語句,未必需要使用新增的引數,

那麼為了避免對原先那些函式呼叫語句的修改,就可以使用預設引數

7、類和物件的基本概念

(1)類的成員函式和類的定義分開寫: 如int crectangle::area() crectangle:: 說明後面的函式是crectangle類的成員函式,而非普通函式。那麼,一定

要通過物件或物件的指標或物件的引用才能呼叫

(2)類成員的可訪問範圍:在類的定義中,用下列訪問範圍關鍵字來說明類成員可被訪問的範圍:

private

: 私有成員,只能在成員函式內訪問

pubilc: 公有成員,可以在任何地方訪問

protected: 保護成員,

如果某個成員前面沒有關鍵字,則預設地被認為是私有成員

(3)成員函式也可以過載

(4)成員函式也可以帶預設引數

8、建構函式(construct)

(1)成員函式的一種,可以有引數但是不能有返回值(void)都不行

(2)作用是對物件進行初始化,如給成員變數賦初值

(3)如果定義類時沒寫建構函式,則編譯器自動生成乙個預設的無引數的建構函式

(4)乙個類可以有多個建構函式(函式過載)

class

complex ;

complex::complex(

double r, double

i) complex c1;

//error, 缺少建構函式的引數

complex * pc = new complex; //

error,沒有引數

complex c1(2); //

okcomplex * pc = new complex(3,4

);class

complex ;

complex::complex(

double r, double

i)complex::complex(

double

r)complex::complex(complex c1, complex c2)

complex c1(

3), c2(1,0), c3(c1, c2);

建構函式在陣列中的使用:

class

csample

csample(

intn)

};

有引數就輸出**** 沒有引數就輸出&&&&&

class

test

test(

int n, int

m) test() ;

};test array1[

3] = ;

test attay2[

3] = ;

test * parray[3] = ; //

只生成了兩個物件, parray[2]沒有初始化,我們並不知道它指向哪,所以不會生成物件

9、複製建構函式

(1)只有乙個引數,即對同類物件的引用, 注意引數必須是引用 不允許出現如: x::x(x)的建構函式

(2)形如: x::x( x&) 或 x::x(const x&), 二者選一, 後者能以常量物件作為引數

(3)如果沒有定義複製建構函式,那麼編譯器生成預設複製建構函式。預設的複製建構函式完成複製功能。

預設複製建構函式:

class

complex ;

complex c1;

//呼叫預設無參建構函式

complex c2(c1); //

呼叫預設的複製建構函式,將c2初始化成和c1一樣

自己定義的複製建構函式:

class

complex ;

complex(

const complex &c)

};complex c1;

complex c2(c1);

4)複製建構函式起作用的三種情況:

1.當用乙個物件去初始化同類的另乙個物件時

complex c2(c1);

complex c2 = c1; //

另外一種寫法,不是賦值,是初始化

2.如果某函式有乙個引數是類a的物件,那麼該函式被呼叫時,類a的複製建構函式將被呼叫

class

a ;

a(a&a)

};void

func(a a1) {}

intmain()

【疑惑】3.如果函式的返回值是類a的物件時,則函式返回時,a的複製建構函式被呼叫

class

a ;

a(const a &a)

};a func()

intmain()

輸出結果是:

copy construct called

4

注意:物件間賦值並不導致複製建構函式被呼叫

常量引用引數的使用:

void

fun(cmyclass obj_)

這樣的函式,呼叫時生成形參會引發複製構造函式呼叫,開銷比較大

所以可以考慮使用cmyclass & 引用型別作為引數

如果希望確保實參的值在函式中不應被改變,那麼可以加上const關鍵字:

void fun(const cmyclass &obj)

北京大學Tensorflow2 0筆記

目前很少用這個啟用函式,因為在深度神經網路中更新引數時需要從輸出層到輸入層逐層進行鏈式求導,而sigmoid函式倒數值為0 0.25之間,鏈式求導需要多層導數連續相乘,會出現多個0 0.25之間的連續相乘,結果趨於零,產生梯度消失,無法進行引數更新 使用中應避免負數特徵進入relu函式,否則會導致神...

北京大學機試題 整數奇偶排序 C

題目描述 time limit 1000 ms memory limit 256 mb 輸入10個整數,彼此以空格分隔。重新排序以後輸出 也按空格分隔 要求 1.先輸出其中的奇數,並按從大到小排列 2.然後輸出其中的偶數,並按從小到大排列。輸入輸出格式 輸入描述 任意排序的10個整數 0 100 彼...

北京大學C語言學習第4天

指標的概念 指標的基本概念 每個變數都被存放在從某個記憶體位址 以位元組為單位 開始的若干個位元組 中 指標 也稱作 指標變數 大小為4個位元組 或8個位元組 的變數,其內容代表乙個記憶體位址。通過指標,能夠對該指標指向的記憶體區域進行讀寫。如果把記憶體的每個位元組都想像成賓館的乙個房間,那麼記憶體...