http://www.cnblogs.com/wanghao111/archive/2009/09/25/1574154.html
1.常量: 通過const關鍵字將一個變量定義爲常量。
const int bufsize=1024;
如果在程序中試圖修改bufsize的值,則會引起一個錯誤。
由於const類型的量一經定義就不能改變它的值,因此在定義時必須初始化。
const double PI; //這條語句將產生錯誤
2.指向const類型對象的指針 const int *p;
p是一個指向int類型對象的指針,但p本身並不是一個常量
。也就是說p可以指向任何一個int類型的對象,但由p所指向的對象不可以通過p來改變值。
3.對象常量
<類名> const <對象名>
或者 const <類名> <對象名>
定義常對象時,同樣要進行初始化,並且該對象不能再被更新
。 4. 常指針
a)<類型> * const <對象>
表示定義一個常量指針,對象本身不能改變,但所指向的值是可以改變的。
b)const <類型> * <對象>
表示定義一個常量的指針或指針常量,該變量的本身可以改變,但所指向的值是不能改變的。
5.常引用
const <類型> &<對象>
使用const修飾符也可以說明引用,被說明的引用爲常引用,該引用所引用的對象不能被更新。
如: const double &v;//v是一個引用
v=12.3 //非法,不能更新
6.常成員函數
使用const關鍵字進行說明的成員函數,稱爲常成員函數。
只有常成員函數纔有資格操作常量或常對象。
沒使用const說明的成員函數不能用來操作常對象。
常成員函數說明格式如下:
<返回類型說明符> <函數名> (<參數列表>) const;
其中,const是加在函數說明後的類型修飾符,它是函數類型的一個組成部分,因此在函數實現部分也要代關鍵字const。
#include <iostream>
using namespace std;
class sample
{
private: int x,y;
public: sample(int i,int j)
{
x=i;
y=j;
}
void disp() //成員函數,別名爲disp1
{
cout << "disp1:x=" << x << ",y=" << y << endl;
}
void disp() const//常成員函數,別名爲disp2
{
cout << "disp2:x=" << x << ",y=" << y << endl;
}
};
void main()
{
sample a(1,2);
a.disp(); //調用成員函數disp(disp1)
const sample b(3,4);
b.disp(); //調用常成員函數disp(disp2)
}
這裏disp()成員函數是重載的,一個是普通的,一個是常成員函數。
常對象自動調用常成員函數。 const是用於保護程序的健壯性,減少程序隱患。
const的用法比較複雜,總結起來又分爲以下兩種:
1:在定義變量時使用:
a: const int a=100;
最簡單的用法,說明變量a是一個常變量;
b: int const b=100;
與a功能相同;
c: const int *a=&b;
指向常數的指針,即指針本身的值是可以改變的,但指向的內容是不能改變的;
d: int const *a=&b;
與c功能相同;
e: int * const a = &b;
常指針,即指針本身的值是不可改變的,但指向的內容是可改變的;
f: const int * const a = &b;
指向常數的常指針,即指針本身與指向的內容都是不可改變的;
g: const int &a=100;
常數引用,即不能改變引用的值;
總結: 在使用const定義變量時,一定要進行初始化操作,在操作符(*,&)左邊的修飾的是指向的內容,在右邊的是本身。
2:在函數用使用:
a: void func(const int a);
做爲參數使用,說明函數體內是不能修改該參數的;
對不參數定義時不同的形式,可參見定義變量時使用方式;
b: const int func();
做爲返回值使用,說明函數的返回值是不能被修改的,在取得返回值時應用const int a = func();
對不 參數定義時不同的形式,可參見定義變量時使用方式;
c: int func() const;
常函數,說明函數是不能修改類中成員的值的,只能用於類的成員函數中;
總結:在函數中使用const,情況與定義變量的情況大致相同。