c++学習ノート:const int*&とconst int*const&の違いについて--新しい「const」はポインタに作用しますか?それとも引用しますか?

5448 ワード

次の手順があります.
 1 int compare(const int &num1, const int *&num2)
 2 {
 3     return (num1 > *num2) ? num1 : *num2;
 4 }
 5 
 6 int main()
 7 {
 8     int i = 9;
 9     int temp = 7;
10     int *p = &temp;
11     compare(i, p);
12     return 0;
13 }

11行でコンパイルエラーが発生します.「int*」タイプの値で「const int*&」タイプの値を初期化することはできません.つまり、私たちが提供した実パラメータ「p」は不正です.
ポインタと参照のタイプは、参照するオブジェクトのタイプと一致しなければならないことを知っていますが、例外として、定数を指すポインタは非常量のオブジェクトを指すことができ、定数参照は任意の式で初期化することができ、私たちのパラメータは一般的な参照を要求するので、その参照のタイプは参照オブジェクトのタイプと一致しなければなりません.関数ヘッダをより多くの場合に適用できるようにするには、「通常参照」を「定数参照」に宣言し、関数宣言を以下の形式に変更することにしました.
/*
 *        :int compare(const int &num1, const int *&num2)
 *        :int compare(const int &num1, const int *const &num2)
 */

int compare(const int &num1, const int *const &num2)
{
    return (num1 > *num2) ? num1 : *num2;
}

int main()
{
    int i = 9;
    int temp = 7;
    int *p = &temp;
    compare(i, p);
    return 0;
}

このときプログラムコンパイルが通過し,実行後に所望の結果が得られる.このとき変数num 2のタイプは「定数を指すポインタの定数参照」である.
 
でも
 
より多くの実験を行った後、以下の手順があります.
 
 1 int compare(const int &num1, int *const &num2)
 2 {
 3     return (num1 > *num2) ? num1 : *num2;
 4 }
 5 
 6 int main()
 7 {
 8     int i = 9;
 9     int temp = 7;
10     const int *p = &temp;
11     compare(i, p);
12     return 0;
13 }

 
ここで、変数「num 2」のタイプが「const int*const&」から「int*const&」に変わり、これまでの結論からnum 2に現れるタイプが「整形ポインタの定数参照」であることが得られ、c++文法定義によれば定数参照が任意の式で初期化できることがわかり、上記のコードは間違いなく、しかし、11行目でコンパイルエラーが発生しました.実パラメータ「const int*」をパラメータ「int*const&」に使用することはできません.
 
以上のように、新たに追加された「const」はポインタに作用する.
 
転載先:https://www.cnblogs.com/u-n-owen/p/11540129.html