C 中const修飾函式形參,函式,函式返回值

2021-08-04 07:14:13 字數 2625 閱讀 2503

** 

在程式設計中我們會經常呼叫函式,呼叫函式就會涉及引數的問題,那麼在形參列表中const形參與非const形參對傳遞過來的實參有什麼要求呢?

先來看乙個簡單的例子:

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

void

print_str(

const

string s)  

intmain()  

毫無疑問,const實參傳遞給const形參,正確呼叫函式,如果你將第4行**中的const去掉,也能得到正確的結果。那麼在去掉const的基礎上將形參變為引用形參,會出現什麼樣的結果呢?看下面的**:

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

void

print_str( string & s)  

intmain()    

發現編譯不通過,如果在第4行的string前加上乙個const,就會通過編譯。進一步研究我們會發現指標形參與引用形參會出現類似的情況。

普通形參加不加const限定符對實參沒有影響,引用形參和指標形參前面沒有const限定符時,實參必須是非const的,而前面有const限定符時對實參也沒有什麼影響

為什麼會出現這種情況?

原因在於實參的傳遞方式不同,函式中的形參是普通形參的時,函式只是操縱的實參的副本,而無法去修改實參,實參會想,你形參反正改變不了我的值,那麼你有沒有const還有什麼意義嗎?引用形參和指標形參就下不同了,函式是對實參直接操縱,沒有const的形參時實參的值是可以改變的,這種情況下怎能用函式來操縱const實參呢。

在類中將成員函式修飾為const表明在該函式體內,

不能修改物件的資料成員而且不能呼叫非const函式。為什麼不能呼叫非const函式?因為非const函式可能修改資料成員,const成員函式是不能修改資料成員的,所以在const成員函式內只能呼叫const函式。

[cpp]view plain

copy

#include 

using

namespace

std;  

class

a  int

get() 

const

};  

防止傳入的引數代表的內容在函式體內被改變,但僅對指標和引用有意義。因為如果是按值傳遞,傳給引數的僅僅是實參的副本,即使在函式體內改變了形參,實參也不會得到影響。如:

[cpp]view plain

copy

void

fun(

const

inti)  

在函式體內是不能改變i的值的,但是沒有任何實際意義。

const修飾的函式引數是指標時,代表在函式體內不能修改該指標所指的內容,起到保護作用,在字串複製的函式中保證不修改源字串的情況下,實現字串的複製。

[cpp]view plain

copy

void

fun(

const

char

* src, 

char

* des)  

void

main()  

而且const指標可以接收非const和const指標,而非const指標只能接收非const指標。

const修飾引用時:如果函式引數為使用者自定義的類物件如:

[cpp]view plain

copy

void

h(a a)  

傳遞進來的引數a是實參物件的副本,要呼叫建構函式來構造這個副本,而且函式結束後要呼叫析構函式來釋放這個副本,在空間和時間上都造成了浪費,所以函式引數為類物件的情況,推薦用引用。但按引用傳遞,造成了安全隱患,通過函式引數的引用可以修改實參的內部資料成員,所以用const來保護實參。

[cpp]view plain

copy

void

h(const

a & a)  

也是用const來修飾返回的指標或引用,保護指標指向的內容或引用的內容不被修改,也常用於運算子過載。歸根究底就是使得函式呼叫表示式不能作為左值。

[cpp]view plain

copy

#include 

using

namespace

std;    

class

a   

int& get()  

};  

void

main()  

函式形參中的const引用

這裡將c primer中函式形參章節有關const和引用的問題簡單小結如下 一 非const非引用形參 這個是乙個平庸的情形。函式引數通過複製對應的實參實現初始化,函式本身對形參的修改不會影響到實參。傳遞給這類函式的實參可以是乙個const型的物件,也可以是非const的物件。乙個需要注意的事情是,...

C 函式 const形參和實參

頂層const 表示任意的物件是常量。底層const 與指標和引用等復合型別有關。對指標而言,頂層const表示指標本身是個常量,而底層const表示指標所指的物件是乙個常量。int i 22 const int ci 20 頂層const,不能修改ci的值 const int p1 ci 底層co...

函式形參 指標,引用,const,陣列形參

指標也是物件,也會拷貝,所以分實參指標和形參指標。在傳進函式時,實參進行拷貝,所以在函式裡改變指標值不影響實參。void reset int ip 引用不是物件,通過引用可以改變實參 void reset int i 使用引用的好處是避免了拷貝。其實也只是兩個變數名的傳遞,和變數規則一致,如果在函式...