C++難點解析之const修飾符

C++難點解析之const修飾符

c++ 相比於其餘編程語言,多是最爲難掌握,概念最爲複雜的。結合本身平時的C++使用經驗,這裏將會列舉出一些常見的難點並給出相應的解釋。c++

const修飾符

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的區別。指針

相關文章
相關標籤/搜索