C++函數——const形參和實參

    頂層const: 表示任意的對象是常量。

     底層const: 與指針和引用等複合類型有關。

    對指針而言, 頂層const表示指針本身是個常量, 而底層const表示指針所指的對象是一個常量。

int i = 22;
const int ci = 20; //頂層const, 不能修改ci的值
const int *p1= &ci; //底層const, 允許修改p1的值, 但是不能通過*p1修改ci
的值。
int *const p2 = &i; //頂層const, 不能修改p2的值, 但是允許通過*p2修改i
的值

    用實參初始化形參時, 會忽略掉頂層const, 也就是說,當形參有頂層const時, 傳給它常量對象或者非常量對象都是可以的。

總結

     int cube(int i); 實參可以爲int類型, 也可以爲const int類型。 在函數體中可以修改i的值, 函數不會修改實參的值。

    int cube(const int i); 實參可以爲int類型, 也可以爲const int類型。 在函數體中不可以修改i的值, 函數不會修改實參的值。

    int pCube(int * pi); 實參爲int * 類型的指針, 不能爲const int * 類型。 可以通過修改* pi 的值修改實參指向的對象的值, 修改pi對實參沒有影響。

    int pCube(const int pi); 實參可以爲const int 類型,也可以爲int * 類型。 不可以通過修改* pi 的值修改實參指向的對象的值, 修改pi對實參沒有影響。

    int pCube(int * const pi); 實參爲 int * 類型, 不能爲const int * 類型。 可以通過修改* pi 的值修改實參指向的對象的值, 不可以給pi賦值。

    void reset(int &r); 實參爲int類型, 不可以爲const int 類型。 可以通過修改r的值, 從而修改實參的值。

    void print(const int &r); 實參可以爲int類型, 也可以爲const int類型, 不可以修改r的值。

#include<iostream>

using namespace std;

int fun1(int i);
int fun2(const int i);
int pfun1(int *pi);
int pfun2(const int *pi);
int pfun3(int *const pi);
int rfun1(int &r);
int rfun2(const int &r);
int main()
{
    //num1爲int類型的變量,可以修改它的值
    //num2爲int類型的常量,不可以修改它的值
    int num1 = 10;
    const int num2 = 10;
    num1 = 20;
    //num2 = 20;

    //普通指針,可以修改p1的值,也以通過修改*p1來修改num1的值。
    //所以只能用int類型的數據來初始化,不能用const int類型,不能修改常量的值
    int *p1 = &num1;
    //int *p2 = &num2; //出錯

    //底層const,可以修改指針(p3,p4),但是不可以通過*p3,*p4,去修改num1, num2的值。
    //可以使用int類型或const int類型的數據來初始化
    const int *p3 = &num1;
    const int *p4 = &num2;

    //頂層const,不可以修改指針(p5,p6),但是可以通過*p5去修改num1的值。
    //所以只能使用int類型的數據來初始化,不能const int類型
    int * const p5 = &num1;
    //int * const p6 = &num2;  //錯誤

    //int類型的引用,可以通過r1去修改num1的值,所以只能用int類型去初始化,不能使用const int類型
    int &r1 = num1;
    //int &r2 = num2; //出錯

    //const int類型的引用,不能修改r3,r4的值
    //可以使用int類型的數據來初始化,也可以使用const int類型
    const int &r3 = num1;
    const int &r4 = num2;

    //實參爲int類型或const int類型
    cout << fun1(num1)  << " "<< fun1(num2) << endl;
    cout << fun2(num1) << " " << fun2(num2) << endl;

    //實參只能爲int類型
    cout << pfun1(&num1) << endl;
    //cout << pfun1(&num2) << endl; //出錯

    //所以實參可以是int類型,也可以是const int類型
    cout << pfun2(&num1) << " " << pfun2(&num2) << endl;

    //所以實參類型只能是int類型
    cout << pfun3(&num1) << endl;
    //cout << pfun3(&num2) << endl; //出錯

    //實參類型只能是int類型
    cout << rfun1(num1) << endl;
    //cout << rfun1(num2) << endl; //出錯

    //實參類型可以是int類型,也可以是const int類型
    cout << rfun2(num1) << " " << rfun2(num2) << endl;
    return 0;
}

//可以修改形參i
int fun1(int i)
{
    //i = 0;
    return i * i * i;
}
//不可以修改形參i
int fun2(const int i)
{
    //i = 0;  //出錯
    return i * i * i;
}

int pfun1(int *pi)
{
    //*pi = 0;
    return *pi * (*pi) *(*pi);
}

//可以修改pi,但是不可以修改*pi。所以實參可以是int類型,也可以是const int類型
int pfun2(const int *pi)
{
    //*pi = 0;  //出錯
    return *pi * (*pi) *(*pi);
}

//不可以修改pi,但是可以修改*pi,所以實參類型只能是int類型
int pfun3(int *const pi)
{
    //*pi = 0;
    return *pi * (*pi) *(*pi);
}

//可以修改r,實參類型只能是int類型
int rfun1(int &r)
{
    //r = r * r * r;
    return r * r * r;
}
//不可以修改r,實參類型可以是int類型,也可以是const int類型
int rfun2(const int &r)
{
    //r = r * r * r; //出錯
    return r * r * r;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章