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...