C 基礎學習第二課 變數的初始化

2021-10-19 02:15:13 字數 3997 閱讀 2750

1,背景

1,在c++中,初始化與賦值並不是同乙個概念;

2,初始化:建立變數時賦予其乙個初始值;

3,賦值:把物件(已經建立)的當前值刪除,而用乙個新值代替;

2,列表初始化

作為c++11新標準的一部分,用花括號來初始化變數得到了全面的應用,(在此之前,只是在初始化陣列的時候用到);

形式:

int a=

;int a

;//這兩種方式都可以將變數a初始化為0

侷限性:

當對內建型別使用列表初始化時,若初始值存在丟失的風險,編譯會報錯;

例子:

int a=

3.123

;//waring :"初始化":從 "double"轉換到 "int",可能丟失資料;

int a=

;//error 從 "double"轉換到 "int"需要收縮轉換

3,直接初始化

在變數的右側,使用圓括號將變數的初始值包住。

例子: inta(

999)

;//true

注意事項:不能用圓括號給陣列初始化;

事例:char a[5]

=;//true

char a[5]

=(0,

1,2,

4,5)

;//error 被判斷成逗號表示式

4,三目運算子

1,在c語言中,條件表示式只能作左值;

2,c++中條件表示式可以作右值和左值;

int a=9;

int b=8;

int max;

max=a>b?a:b;

//c語言和c++都能通過

a>b?a:b =

666;

//c語言報錯 c++通過

解決辦法:

//讓表示式返回位址,c語言就可以通過

*(a>b?

&a:&b)

=999

;//true

5,new/delete和malloc/free

1,c++提供了new/delete運算子,代替了malloc/free函式,執行效率更高;

new申請記憶體:

1,指標變數 = new 型別;//申請記憶體的時候初始化

2,指標變數 = new 型別[size]

;//申請陣列,建立陣列的時候不能指定初始值;

delete釋放記憶體:

1,delete 指標變數;//釋放單個物件

2,delete[size] 指標變數;//釋放陣列

具體例子:

普通資料:

int* p=new int(9

);//初始化為9

delete p;

//釋放

p=nullptr;

//將其置空

陣列:int

* p=new int[5

];//全部初始化為0

delete[

5] p;

//釋放陣列

p=nullptr;

//將其置空

2,移動語義(提高效率,不用開闢空間兩次)

例子:

int* pa=new int(33

);//無需釋放,將這個申請到的記憶體空間,轉給其他變數;

//定義另乙個同型別的變數

int* py=nullptr;

py=pa;

pa=nullptr;

delete py;

//只需釋放一次

py=nullptr;

6,引用

1,引用:對某一變數或物件的別名【注意:對引用的操作和對其繫結的變數或物件的操作完全等價】【關鍵:引用的變數名與被引用的變數名實際上是同乙個,相當於乙個人的本名和小名】

2,定義:

語法:型別 &引用名=目標變數名;

例子:void

fun(

int* n)

//在函式內部改變實參的值需要傳變數的位址;

fun(nullptr)

;//傳nullptr會發生中段

c++的另一種方法:

void

fun(

int& n)

3,注意事項:

·引用必須初始化;

int

& a;

//error

方法:int b=0;

int& a=b;

//true

·引用只能被初始化乙個物件,不能再指向其他物件;

int a=

6,b=9;

int& n=a;

n=b;

//只是把b的值賦值給了n,而不是n引用了b;

·如果要引用右值,可以使用常量引用(無法修改)

int

& n=

999;

//error "初始化":無法從 "int"轉換為 "int&",非常量引用的初始值必須為左值

const

int& n=

999;

//true

·右值引用 (相當於常量引用,但是可以修改)

int

&& n=

999;

//true

n=9999

;//可以修改值

注意: 例子:

voida(

int&& b)

;//右值引用

int n=99;

a((int

&&)n)

;//不符合規範

改為:a

(std:

:move

(n))

;//c++中: std::move()將左值轉成右值**

****

****

****

****

****

****

****

****

****

****

****

****

****

****

注意:右值引用與移動語義結合

例子:voidt(

int*

&& d,

int*

&& s)

int* pa=new int(33

);//無需釋放,將這個申請到的記憶體空間,轉給其他變數;

//定義另乙個同型別的變數

int* py=nullptr;

t(std:

:move

(py)

,std:

:move

(pa));

delete py;

//只需釋放一次

py=nullptr;

4,引用的用處

·作為函式引數

void

fun(

int* n)

//在函式內部改變實參的值需要傳變數的位址;

fun(nullptr)

;//傳nullptr會發生中段

c++的另一種方法:

void

fun(

int& n)

//可以用指標的引用替代二級指標

如:inta(

int*

& p)

;//可以改變指標的指向;

·作為函式返回值

int&a

()int& y=a(

);y=777

;

5,引用的本質

·引用在c++中,內部實質上是乙個常指標:type &name <==> type* const name

·c++編譯器在編譯過程中使用常指標作為引用的內部實現,因此引用所占用的空間大小與指標相同

Python基礎第二課

練習題 1 編寫乙個python程式來查詢那些既可以被7整除又可以被5整除的數字,介於1500和2700之間。your code here i for i in range 1500 2700,1 if i 7 0and i 5 0 2 龜兔賽跑遊戲 題目描述 話說這個世界上有各種各樣的兔子和烏龜,...

linux學習第二課

今天跟著benjamin學習linux的第二課,主講內容 linux作業系統的檔案 一.linux系統下除了一般檔案外,所有的目錄和裝置 光碟機,硬碟等 都是以檔案的形式存在了。所以這裡就出現了乙個問題,我們怎樣才能使用物理裝置中的資料呢,linux系統是將物理裝置掛載 linux中乙個非常重要的概...

Android學習第二課

android技術結構圖 是針對安卓,對linux kernel進行優化 libraries android rumtime core libraries dalvik virtual machine 常用庫應用程式框架方便了我們的開發 手機的應用程式 android的四大元件 activity s...