C++中const關鍵字的應用,簡單、易懂、實用!

文章稍長,但是舉例都很易懂。

1. 常量
c++用const將對象i定義爲一個常量。定義之後,i的值就不可以再變了,所以i必須在定義時候被初始化。
所以 const int i; //錯誤的,i 必須被初始化 (在C中這種寫法可以,但是這裏只說C++的環境下)

#include<iostream>

int main()
{
	const int i = 10;		//正確,i被初始化
}

2. 代替#define的值替換功能

舉例:

#define NUMBER 100

上面這行代碼是C中典型的值替換手段。
但是C++中這樣寫:

const NUMBER = 100;
//或者
const int NUMBER = 100;

這樣寫的好處:
①.明顯的減少代碼量
②.const可以附帶數據類型(int),但是#define(宏常量)沒有該功能,只是簡單的字符替換,沒類型檢查,所以在字符替換的時候會出意想不到的錯誤。

3.指針和const
在指針的聲明中,指向const對象的指針和const指針是不一樣的。
舉例:

//注意!!p可以不初始化,它可以指向任何東西。p這個指針指向一個int類型的數,但是這個數是const屬性。
 const int* p;			
 //等價於
 int const *p;


 //下面的p是個const修飾的指針,所以p必須被初始化。  但是這個p指向的值可以被改變。
 int a = 1;
 int* const p = &a;
 *p = 2;			//改變p所指向的值,正確。
 

4.修飾函數參數及函數返回值

①const修飾成員函數

class A{
	void fun1();
	void fun2() const;
};

const改變的是this指針。this指針原類型爲: A* const(this爲類A的指針,我理解爲A* const this),被const修飾後變爲:const A* const,(第一個const修飾的就是this指向的對象,我理解爲 const A* const this)。
const修飾的成員函數不能調用或者修改該類的對象。當然mutable成員可以。

再記最重要的一點:const修飾的成員函數的應用場景。
const對象,指向const對象的指針都且只能調用const成員函數。調用非const成員函數則會出錯。反過來,非const對象或者指針,都可以調用const成員函數和非const成員函數。所以,如果一個類中沒有const成員函數,當你使用const對象時,這個對象誰都調用不了。

舉例:

	class A {
		void fun1() const;
		void fun2();
	}

	const A a1;		//a1對象只可以調用fun1成員函數。
	const A* a2 = new A;		//a2指針的調用規則也是只可以調用fun1函數。
	
	
	class B {
		void bfun1();
		void bfun2();
	}

	B b1;			//b1可以調用bfun1和bfun2
	const B b2;		//b2調用不了任何成員函數
	B* b3 = b2;		//b3是指向const對象b2的指針,也調用不了任何成員函數
	B& b4 = b2;		//b4是const修飾的b2對象的引用,也調用不了任何成員函數。
					//總結:無論是const對象(b2),還是指向b2的指針b3,還是b2的引用b4,都無法調用非const成員函數。




	class C {
		void cfun1();
		void cfun2() const;
	}
	
	C c;
	c.cfun1();		//正確
	c.cfun2();		//正確
	//總結:非const修飾的對象,可以調用const成員函數和非const成員函數。

②const修飾數據成員
const修飾數據成員,記住一點:必須在構造中初始化成員變量


	#include<iostream>
	
	class A{
	public:
	
		int m_a;
		const int m_b;
	}

	A a;		//此處想要構造一個對象a,但是程序不會執行。  
	//因爲const修飾的成員變量m_b必須在構造的初始化列表中進行初始化



	//修改如下:
	class A{
	public:
		A()
		: m_b(100)
		{}			//初始化時,初始化const修飾的成員變量,這樣就可以了。
		
		int m_a;
		const int m_b;
	}



待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章