新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C++中const與指針、引用的分析

        C++中const與指針、引用的分析

        作者: 時間:2016-12-01 來源:網絡 收藏

        int num = 10;

        int &newname = num;
        const int &othername = num;

        引用主要是上面的兩種,這兩種的區別相對來說比較大,而且加入了const限定符以后,引用的能力往往變的更加的強大。
        一般來說對于const對象而言,一般只能采用const引用,這與前面的const對象只能采用指向const對象的原因是一樣的,如果對引用沒有進行限定,可能會通過引用修改數據,這是不允許的。也就是說const引用與指向const對象的指針有一定的相似性,即不能通過這個引用或者指針來修改原來的數據。保證數據的const特性。也就是說非const引用不能引用const對象,如果不小心引用編譯器會出現下面的錯誤:

        invalid initialization of reference of type ‘int&’ from expression of type ‘const int’

        因此非const引用只能針對非const的同類型數據。這是需要注意的。比如string,和字符串字面值都不能直接引用。因為類型不相同,這是在C++函數定義中經常出現的問題,在后期的博文中再分析。在引用中加入const的就是對于這個引用而言,不能通過自己來修改原始的數據,這與指向const的指針有很大的相似性,

        但是往往const引用的初始化并不一定要去對象是const的,甚至可以是不同類型的對象,這種優越性是連指針(指針只能指向同一類型的數據,如果一定要指向需要強制類型轉換)都沒有的,也就是可以將不同類型的非const或者const對象來初始化一個const引用。但是這個const限定符就限定了該引用指向的對象是不能通過該引用來修改的。如果嘗試采用const的引用進行修改,編譯器會出現如下的錯誤:

        error: assignment of read-only reference...

        綜合上面的描述可知:非const引用只能綁定到該引用同類型(string和字符串字面值(const char *)之間都不可以)的非const對象,而const引用則可以綁定到任意的一種對象上(非const、const、甚至不同類型),這種差別在函數的參數中有較大的體現。
        通過下面的例子來說明一下上面的分析:

        #include
        #include
        #include

        using namespace std;

        int main()
        {
        int num = 20;
        const int array_size = 10;

        int &pnum = num;
        const int &cpnum = num;
        /*采用引用直接初始化const類型的引用*/
        const int &csize1 = pnum;

        /*const的變量不能采用非const的引用*/
        //int &psize = array_size;
        /*const類型數據只能采用指向const的指針來指向*/
        const int &csize = array_size;

        cout << "Before change..." << endl;
        cout << "The num of num = " << num << endl;
        cout << "pnum = " << pnum << " "
        << "cpnum = " << cpnum << " "
        << "csize1 = " << csize1 << endl;

        num = 30;
        cout << "After the first changed..." << endl;
        cout << "The num of num = " << num << endl;
        cout << "pnum = " << pnum << " "
        << "cpnum = " << cpnum << " "
        << "csize1 = " << csize1 << endl;

        /*通過引用修改變量的值*/
        pnum = 40;
        cout << "After the second changed..." << endl;
        cout << "The num of num = " << num << endl;
        cout << "pnum = " << pnum << " "
        << "cpnum = " << cpnum << " "
        << "csize1 = " << csize1 << endl;

        /*不能采用const的引用修改對象,
        *這與指向const的指針特性的相似處*/
        /*
        csize1 = 50;
        cout << "After the second changed..." << endl;
        cout << "The num of num = " << num << endl;
        cout << "pnum = " << pnum << " "
        << "cpnum = " << cpnum << " "
        << "csize1 = " << csize1 << endl;
        */

        double dnum = 10.1;
        /*非const的引用只能綁定相同類型的對象*/
        //int &dname = dnum;

        /******************************************
        *const引用可以綁定不同類型的對象,
        *因此const引用就能更加方便的作為函數的形參
        *******************************************/
        const int &dothername = dnum;

        return 0;
        }


        上面的實驗結果基本上符合分析的結論。

        總結
        const的使得引用與指針的變化更加復雜,總體而言,const主要是保證了通過指針或者引用不修改原始的數據,但是至于原始的數據是否可以修改,這就需要參看數據的類型。
        在存在const的對象中,只能采用包含限定符const的引用或者指向const的指針來操作。
        const的引用比較強大,初始化的過程中可以采用任意的對象,const對象,非const對象,甚至其他類型的數據。const引用支持隱式類型轉換。而指向const的指針則不能,只能指向同一類型的數據,但是可以采用強制類型轉換,初始化或者賦值過程中對數據類型沒有要求,可以是const對象的地址,也可以是非const對象的地址。
        const引用和指向const對象的指針都是自己以為自己指向的對象是不能修改的,采用const的指針或者引用就能避免原始數據修改。


        上一頁 1 2 下一頁

        關鍵詞: C++const指針引

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 北海市| 岳普湖县| 南漳县| 隆化县| 措美县| 秭归县| 阿鲁科尔沁旗| 汶上县| 延吉市| 博爱县| 邻水| 娄烦县| 桂平市| 蕉岭县| 忻城县| 庆元县| 吉林省| 米林县| 华亭县| 十堰市| 右玉县| 万荣县| 景泰县| 赣州市| 永清县| 三河市| 黄平县| 盘山县| 攀枝花市| 盐城市| 江北区| 梁山县| 榕江县| 大洼县| 上饶市| 通城县| 玉溪市| 师宗县| 绵竹市| 彝良县| 贡嘎县|