c++ 相比於其餘編程語言,多是最爲難掌握,概念最爲複雜的。結合本身平時的C++使用經驗,這裏將會列舉出一些常見的難點並給出相應的解釋。c++
const在c++中經常使用語意是固定,不可改變,能夠用在變量定義或聲明修飾、函數參數修飾、函數聲明。下面將根據不一樣的場景依次來講明const的用法。編程
對於變量定義,須要區分是通常定義仍是指針或引用。在通常定義中const變量定義以後須要馬上初始化,而在指針中則須要區別頂層const或底層const來分別對待。頂層const表示指針指向的對象爲const,底層const表示指針自身爲const。編程語言
/* * const變量必須在定義的時候同時初始化, * iA和iB兩種形式含義是相同的 */ const int iA = 1; int const iB = 2; int iC = 3; /* * pIA爲頂層const指針,表示不能夠經過pIA改變iA的值, * 可是能夠修改pIA指向的對象。 */ const int *pIA = &iA; pIA = &iB; /* * pIC爲底層const,表示不能夠修改pIC指向的對象, * 可是能夠經過pIC指針修改iC的值。 */ int* const pIC = &iC; *pIC = 4;
const修飾函數參數本質上和變量定義是同樣的。在函數參數中,const表示參數在函數體中不會被修改。一樣須要注意的是,針對指針的頂層const和底層const的區別。函數
using namespace std; /* * fname爲非指針且非const形參,能夠在函數體中修改。 * 而lname則爲非指針const形參,在函數體中不能進行任何修改。 */ void FuncParam(string fname, string const lname) { fname = "Jackie"; cout << "first name=>" << fname << endl; cout << "last name=>" << lname << endl; } /* * 針對const對指針形參的修飾,主要須要區分頂層const和底層const。 */ void FuncParam(const string *fname, string* const lname) { string* ptrName = new string("Jackie"); if(!ptrName) { throw new std::runtime_error("invalid name pointer"); } fname = ptrName; cout << "first name=>" << *fname << endl; cout << "last name=>" << *lname << endl; }
const在函數聲明中有兩個可修飾位置,分別是函數返回值和函數末尾。修飾函數返回值時表示函數的返回值是不可修改的,而修飾函數總體(即在函數聲明的末尾處)只能在類的成員函數中使用,表示該成員不會對類的其它屬性產生影響。spa
using namespace std; class ConstCl { public: /* * GetCName成員返回值爲const string類型, * GetName成員返回值爲string類型,且其不會修改ConstCl的其它屬性。 */ const string GetCName(); string GetName() const; };
對於const修飾符,咱們在平常的使用中須要謹記其不可修改的含義,同時須要清楚針對指針時的頂層const和底層const的區別。指針