C++中const修飾函數,函數參數,函數返回值的作用


原博客: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,使得函數調用表達式不能作為左值
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM