原博客:https://blog.csdn.net/my_mao/article/details/22872149
const修飾函數
在類中將成員函數修飾為const表明在該函數體內,不能修改對象的數據成員而且不能調用非const函數。為什么不能調用非const函數?因為非const函數可能修改數據成員,const成員函數是不能修改數據成員的,所以在const成員函數內只能調用const函數。
#include <iostream>
using namespace std;
class A{
private:
int i;
public:
void set(int n){ //set函數需要設置i的值,所以不能聲明為const
i = n;
}
int get() const{ //get函數返回i的值,不需要對i進行修改,則可以用const修飾。防止在函數體內對i進行修改。
return i;
}
};
const修飾函數參數
防止傳入的參數代表的內容在函數體內被改變,但僅對指針和引用有意義。因為如果是按值傳遞,傳給參數的僅僅是實參的副本,即使在函數體內改變了形參,實參也不會得到影響。如:
void fun(const int i){
i = 10;
}
在函數體內是不能改變i的值的,但是沒有任何實際意義。
const修飾的函數參數是指針時,代表在函數體內不能修改該指針所指的內容,起到保護作用,在字符串復制的函數中保證不修改源字符串的情況下,實現字符串的復制。
void fun(const char * src, char * des){ //保護源字符串不被修改,若修改src則編譯出錯。
strcpy(des,src);
}
void main(){
char a[10]="china";
char b[20];
fun(a,b);
cout<<b<<endl;
}
而且const指針可以接收非const和const指針,而非const指針只能接收非const指針。
const修飾引用時:如果函數參數為用戶自定義的類對象如:
void h(A a){
…………
…………
}
傳遞進來的參數a是實參對象的副本,要調用構造函數來構造這個副本,而且函數結束后要調用析構函數來釋放這個副本,在空間和時間上都造成了浪費,所以函數參數為類對象的情況,推薦用引用。但按引用傳遞,造成了安全隱患,通過函數參數的引用可以修改實參的內部數據成員,所以用const來保護實參。
void h(const A & a){
…………
…………
}
const修飾函數返回值
也是用const來修飾返回的指針或引用,保護指針指向的內容或引用的內容不被修改,也常用於運算符重載。歸根究底就是使得函數調用表達式不能作為左值。
#include <iostream>
using namespace std;
class A {
private:
int i;
public:
A(){i=0;}
int & get(){
return i;
}
};
void main(){
A a;
cout<<a.get()<<endl; //數據成員值為0
a.get()=1; //嘗試修改a對象的數據成員為1,而且是用函數調用表達式作為左值。
cout<<a.get()<<endl; //數據成員真的被改為1了,返回指針的情況也可以修改成員i的值,所以為了安全起見最好在返回值加上const,使得函數調用表達式不能作為左值
}
