C++ 與const相關的要點整理

1.const與變量(基本數據類型變量)

在C++中,被const關鍵字修飾的變量,其值在程序運行時不可改變,我們稱之爲即常量。被const關鍵字修飾的變量和普通變量一樣,擁有他自己的儲存空間。

定義const變量的格式爲:

//const 數據類型 變量名 = 常量值; 
const int i = 100;

或者交換const與數據類型的位置也是可以的:

int const i = 100;

 需要注意的地方:

1.定義const變量的同時要對它進行初始化,即給它賦值,不可先定義空的const變量然後在後面的代碼中賦值

2.const變量的作用域和普通變量一致,即只在所在的代碼塊存活,離開所在代碼塊會被釋放

3.const變量作爲類的成員變量時,除定義時可對其初始化之外,還可在構造函數的初始化表達式中對其進行初始化,但不可以在構造函數體內初始化

2.const與指針

const指針具有const普通變量一樣的特性,例如運行時不可改變值,定義時必須初始化等等。但根據指針聲明時const關鍵字所在的位置不同,該指針的特點也不同,我們以 const與  “ * ” 符號的位置來區分。

1.在“*”前加const的常指針:

定義格式:

int a = 0;
const int* i = &a;

 根據上文提到的,將const與int的位置交換也是可以的,這也是爲何我強調用 “*”與const的位置來區分不同的常指針的原因:

int const* i = &a;

在“*”號前加const關鍵字的指針意爲禁止通過指針間接修改變量的指針,即可以用其他變量的地址對指針賦值,但是不可通過指針修改它所指變量的值,例如:

int a = 10,b = 20;
const int* p = &a; //定義時用變量a的地址對其進行初始化
p = &b; //正確, 這種const指針可以指向不同的變量
b = 50; //正確,禁止通過這種const指針間接修改變量的值不代表變量不可修改
*p = 50; //錯誤,不可通過這種const指針間接改變其指向變量的值
cout << *p << endl; //正確,可以訪問間接變量的值但不可以修改

需要注意的是,這種指針可以先定義,後賦值,不像const普通變量一樣必須定義時賦值:

int a = 10;
const int* p;//定義時可以不賦值(初始化)
p = &a;//允許在定義後再進行賦值(初始化)

2.在“*”後加const:

這種方式定義的指針意爲恆指向某個變量的指針,即該指針指向的變量不可變,只能一直指向一個變量,定義格式:

int a = 10,b = 20;
int* const p = &a;//定義時必須對其初始化(賦值)

這種指針在初始化後便不可改變其指向的變量,但是可以通過該指針間接修改變量的值:

int a = 10,b = 20;
int* const p = &a;//定義時必須對其初始化(賦值) 
p = &b;//錯誤,不可改變其指向的變量 
*p = 50;//正確,可以通過該指針間接修改變量的值 

3. 在“*”前後都加const

這種方式聲明的指針具有上面兩種聲明方式的特點,即既恆指向同一個變量,又不可通過該指針間接修改變量的值,例如:

int a = 10,b = 20;
const int* const p = &a;
*a = 50;//錯誤 
p = &b;//錯誤 

3.const成員函數

在C++的類中,可以通過const聲明常成員函數,常成員函數不可修改類中的成員變量,只可以讀取,定義格式如下成員函數fun():

class A{
    public:
	void fun() const{
	    cout << "A::fun()" << endl;
	}
	
};

成員函數可以通過是否爲const函數來進行重載,例如:

class A{
	
	public:
		void fun() const{
			cout << "A::fun() const" << endl;
		}
		
		void fun(){
			cout << "A::fun()" << endl;
		}
	
};

使用const進行重載的函數在調用時根據對象的不同調用不同的對象,以上面的類A爲例:對於一般的對象,調用fun()時會調用非const的函數,對於const 對象,調用fun()時會默認調用const的fun()函數,下面貼出完整代碼以供測試:

#include <iostream> 

using namespace std;

class A{
	
	public:
		void fun() const{
			cout << "A::fun() const" << endl;
		}
		
		void fun(){
			cout << "A::fun()" << endl;
		}
	
};

int main()  
{  
	A a;
	a.fun();
	
	const A b;
	b.fun();
	
    return 0;  
}  

使用Dev C++運行該程序,輸出:

A::fun()
A::fun() const

如此便驗證了我上文所說的調用規則。

對於const成員函數還需注意以下幾點:

1.常成員函數在聲明和定義時都要加上const關鍵字,否則編譯報錯:

class A{
	
	public:
		void fun() const;
	
};
void A::fun() const{
		cout << "A::fun() const" << endl;
	}

2.常成員函數中只能調用常成員函數,不可以調用非const成員函數,因爲非const成員函數可能修改成員變量的值 ,其次,const對象只能調用const成員函數

 

本文到此結束。

參考資料:

王慧 王浩等編著.《零基礎學C++》.第三版.機械工業出版社

王珊珊 臧洌 張志航等編著.《C++程序設計教程》.第三版.機械工業出版社

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