const在c++中用來修飾內建型別變數,自定義物件,成員函式,返回值,函式引數。
一、修飾普通型別變數
const
int a =7;
int b=a;a=8
;//不被允許
最後a仍然是8,在加上了const關鍵字後,a就被編譯器認為是乙個常量,不允許修改。
如果非要改,可以在const前面再加上volatile關鍵字。
volatile
const
int a =9;
int*p =
(int*)
&a;*p =8;
cout << a << endl;
system
("pause");
return
0;
這樣a的值就變成了8,但是注意,直接給a賦值還是不可以的,會有紅線。
二、修飾指標類變數
const修飾指標變數有以下三種情況:
a:const修飾指標指向的內容,內容為不可變的量。
b:修飾指標,指標為不可變的量。
c:const修飾指標和指標指向的內容,二者都為不可變的變數。
a:
int a=8;
const
int* p=
&a;//指標指向的內容,a的位址,不可被改變
b:
int a=8;
int*
const p=
&a;*p=9;
//這是允許的
int b=7;
//p=&b;這是不可以的
由於此處的const修飾的是p,而不是int* p,所以const對應不可以改變的值,不再是int* p這個指標內存放的內容,所以不可以改變的是位址。
c:都修飾
int a=8;
const
int*
const p =
&a;
這個時候無論是*p還是p,都無法做任何更改嘍。
三、const引數傳遞和函式返回值
const修飾函式引數也可以分為三種情況:
a:const修飾傳入引數:
int
test
(const
int a)
這種情況一般不需要用const修飾,因為如果不是以引用傳遞,函式會自動產生臨時變數複製實參的值。換句話說,只有傳入引數是引用的情況下,
b:const修飾指標引數,防止指標被篡改:
int
test
(int
*const a)
c:宣告類的成員函式為const。
void
test()
const
const型別的函式表明該函式不會修改物件的成員,同時該函式也不可以呼叫非const函式。例如:
string name=
"chujialu"
;string setname
(string& name)
void
test()
當寫乙個只會被使用一次的函式時,會用到匿名函式。
定義格式:
[捕獲列表](引數列表·)->返回值型別
呼叫:在定義之後直接呼叫:
int c=
(int a,
int b)
->
int(1,
2);//最後乙個括號是引數列表
等價於int
add(
int a,
int b)
int c=
add(a,b)
;
那如果我不想立刻使用這個函式,而是儲存一下以後再用呢?
auto f=
(int a,
int b)
->
int;
int c=f(
1,2)
;
兩個lambda表示式的巢狀
int c=
(int n)(1
);}(
2);
可以實現和上述相同的效果。函式巢狀函式,就稱之為函式式程式設計。有什麼好處呢?
在多執行緒,併發的環境中適用,因為它只依賴於內部。
高階可以參考:
這裡貼出部分回答:
:表示不捕獲任何外部變數
[=]:以傳值的方式捕獲外部的所有變數
[&]:以傳引用的方式捕獲外部的所有變數
[this]:捕獲外部的this指標
[=,&a]:以傳值的方式捕獲外部的所有變數,但是a變數以傳引用的方式捕獲
[a,b]:以傳值的方式捕獲外部變數a和b
[a,&b]:a以傳值方式捕獲,b以傳引用的方式捕獲
C 中委託和Lambda表示式
什麼是委託?簡單來說委託是乙個型別,這個型別可以賦值乙個方法的引用。delegate return type delegate name parameter type parameter name,1.delegate name delegate instance new delegate name...
C 匿名方法和Lambda表示式
有一次看見別人的 裡 以及花裡胡哨的省略寫法感覺好炫酷,就去整理了一下匿名方法和lambda表示式的寫法。1.無返回值型別actiontellname delegate string name 2.委託為方法引數時,省略構造委託例項listlistarray new list listarray.f...
C 匿名函式和Lambda表示式
一 匿名函式 匿名函式不等於匿名方法,匿名函式包含了匿名方法和lambda表示式這兩種概念。1 匿名方法 1 委託 委託是用於引用與其具有相同標籤的方法。即可以使用委託物件呼叫可由委託引用的方法。2 匿名方法 anonymous methods 提供了一種傳遞 塊作為委託引數的技術。匿名方法是沒有名...