C++中const與指針、引用的分析
int num = 10;
int &newname = num;
const int &othername = num;
引用主要是上面的兩種,這兩種的區(qū)別相對來說比較大,而且加入了const限定符以后,引用的能力往往變的更加的強大。
一般來說對于const對象而言,一般只能采用const引用,這與前面的const對象只能采用指向const對象的原因是一樣的,如果對引用沒有進行限定,可能會通過引用修改數(shù)據(jù),這是不允許的。也就是說const引用與指向const對象的指針有一定的相似性,即不能通過這個引用或者指針來修改原來的數(shù)據(jù)。保證數(shù)據(jù)的const特性。也就是說非const引用不能引用const對象,如果不小心引用編譯器會出現(xiàn)下面的錯誤:
invalid initialization of reference of type ‘int&’ from expression of type ‘const int’
因此非const引用只能針對非const的同類型數(shù)據(jù)。這是需要注意的。比如string,和字符串字面值都不能直接引用。因為類型不相同,這是在C++函數(shù)定義中經(jīng)常出現(xiàn)的問題,在后期的博文中再分析。在引用中加入const的就是對于這個引用而言,不能通過自己來修改原始的數(shù)據(jù),這與指向const的指針有很大的相似性,
但是往往const引用的初始化并不一定要去對象是const的,甚至可以是不同類型的對象,這種優(yōu)越性是連指針(指針只能指向同一類型的數(shù)據(jù),如果一定要指向需要強制類型轉(zhuǎn)換)都沒有的,也就是可以將不同類型的非const或者const對象來初始化一個const引用。但是這個const限定符就限定了該引用指向的對象是不能通過該引用來修改的。如果嘗試采用const的引用進行修改,編譯器會出現(xiàn)如下的錯誤:
error: assignment of read-only reference...
綜合上面的描述可知:非const引用只能綁定到該引用同類型(string和字符串字面值(const char *)之間都不可以)的非const對象,而const引用則可以綁定到任意的一種對象上(非const、const、甚至不同類型),這種差別在函數(shù)的參數(shù)中有較大的體現(xiàn)。
通過下面的例子來說明一下上面的分析:
#include using namespace std; int main() int &pnum = num; /*const的變量不能采用非const的引用*/ cout << "Before change..." << endl; num = 30; /*不能采用const的引用修改對象, double dnum = 10.1; /****************************************** return 0;
#include
#include
{
int num = 20;
const int array_size = 10;
const int &cpnum = num;
/*采用引用直接初始化const類型的引用*/
const int &csize1 = pnum;
//int &psize = array_size;
/*const類型數(shù)據(jù)只能采用指向const的指針來指向*/
const int &csize = array_size;
cout << "The num of num = " << num << endl;
cout << "pnum = " << pnum << " "
<< "cpnum = " << cpnum << " "
<< "csize1 = " << csize1 << endl;
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的指針特性的相似處*/
/*
csize1 = 50;
cout << "After the second changed..." << endl;
cout << "The num of num = " << num << endl;
cout << "pnum = " << pnum << " "
<< "cpnum = " << cpnum << " "
<< "csize1 = " << csize1 << endl;
*/
/*非const的引用只能綁定相同類型的對象*/
//int &dname = dnum;
*const引用可以綁定不同類型的對象,
*因此const引用就能更加方便的作為函數(shù)的形參
*******************************************/
const int &dothername = dnum;
}
上面的實驗結(jié)果基本上符合分析的結(jié)論。
總結(jié)
const的使得引用與指針的變化更加復(fù)雜,總體而言,const主要是保證了通過指針或者引用不修改原始的數(shù)據(jù),但是至于原始的數(shù)據(jù)是否可以修改,這就需要參看數(shù)據(jù)的類型。
在存在const的對象中,只能采用包含限定符const的引用或者指向const的指針來操作。
const的引用比較強大,初始化的過程中可以采用任意的對象,const對象,非const對象,甚至其他類型的數(shù)據(jù)。const引用支持隱式類型轉(zhuǎn)換。而指向const的指針則不能,只能指向同一類型的數(shù)據(jù),但是可以采用強制類型轉(zhuǎn)換,初始化或者賦值過程中對數(shù)據(jù)類型沒有要求,可以是const對象的地址,也可以是非const對象的地址。
const引用和指向const對象的指針都是自己以為自己指向的對象是不能修改的,采用const的指針或者引用就能避免原始數(shù)據(jù)修改。
評論